Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.11.2010, 14:10   #1
Azartov
 
Регистрация: 08.11.2010
Сообщений: 3
Вопрос Как обратиться к полям базового класса?

Привет!
Подскажите как обратиться к полям базового класса?

Есть Класс Base,
производный приватно от него класс Derived и
производный публично от Derived класс Derived_1.

Код:
class Base
{
	public:
	int i;

	Base();
	const unsigned int get_addr_d();

	protected:
	long l;

	private:
	double d;
};

class Derived : private Base
{
	private:
	float f;

	public:
	Derived();
	Derived(int i1, long l1, float f1);
	friend ostream& operator<< (ostream& os, Derived& D);
};

class Derived_1 : public Derived
{
	public:
	Derived_1(int i1, long l1);
	//void foo();
};
Следующий код почему-то не прокатывает:
Код:
Derived_1::Derived_1(int i1, long l1)
{
	Derived::i = i1;
//	Derived::l = l1;
	cout<<"KONSRUKTOR Derived with parametrs!" <<endl;
	cout<<"i=" <<Derived::i <<endl;
//	f = f1;
}
На строчке где идет присвоение Derived::i = i1 с ошибкой 'Base::i' is not accessible.

Пишу на на Borlsnd C++ for DOS
Как быть?
P.S. Полный код программы...
Код:
#include <conio.h>
#include <stdio.h>
#include <iostream.h>

int i;


class Base
{
	public:
	int i;

	Base();
	const unsigned int get_addr_d();

	protected:
	long l;

	private:
	double d;
};

const unsigned int Base::get_addr_d()
{
	return (unsigned int) &d;
}

Base::Base()
{
	i = 1;
	l = 10;
	d = 1.01;
	cout<<"KONSRUKTOR Base!" <<endl;
	cout<<"i=" <<i <<endl <<"l=" <<l <<endl <<"d=" <<d <<endl;

}

class Derived : private Base
{
	private:
	float f;

	public:
	Derived();
	Derived(int i1, long l1, float f1);
	friend ostream& operator<< (ostream& os, Derived& D);
};

ostream& operator<< (ostream& os, Derived& D)
{
	os <<"&i = ";
	os <<(unsigned int)&D.i<<endl;
	os <<"&l = "<<(unsigned int)&D.l<<endl;
	os <<"&f = "<<(unsigned int)&D.f<<endl;
	os <<"&d = "<<D.get_addr_d() <<endl;
  	return os;
}

Derived::Derived()
{
	i = 2;
	l = 20;
//	d = 2.02;
	f = 22.22;
	cout<<"KONSRUKTOR Derived!" <<endl;
	cout<<"i=" <<i <<endl <<"l=" <<l <<endl <<"f=" <<f <<endl;
}

Derived::Derived(int i1, long l1, float f1)
{
	i = i1;
	l = l1;
//	d = d1;
	f = f1;
	cout<<"KONSRUKTOR Derived with parametrs!" <<endl;
	cout<<"i=" <<i <<endl <<"l=" <<l <<endl <<"f=" <<f <<endl;
}

class Derived_1 : public Derived
{
	public:
	Derived_1(int i1, long l1);
	//void foo();
};

Derived_1::Derived_1(int i1, long l1)
{
	Derived::i = i1;
//	Derived::l = l1;
	cout<<"KONSRUKTOR Derived with parametrs!" <<endl;
	cout<<"i=" <<Derived::i <<endl;
//	f = f1;
}

/*void Derived_1::foo()
{
	i++;
	l += 1;
	cout<<"Funkcia foo: i = " << i <<", l = " <<l <<endl;
} */



int main()
{
	clrscr();
	Base B;
	getch();
	clrscr();
	Derived D;
	getch();
	clrscr();
	Derived D2 = Derived(5, 55, 5.5);
	getch();
    clrscr();

	cout<<"D2:"<<endl;
	cout <<D2<<endl;
	getch();

	Derived_1 D_1 = Derived_1(1, 2);
	D_1.foo();


	getch();
	return 0;
}
Azartov вне форума Ответить с цитированием
Старый 08.11.2010, 14:28   #2
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

При Private-наследовании все спецификаторы меняются на Private, то есть переменная i класса Base будет доступна внутри класса Derived, но предок Derived_1 не сможет к ней обратиться. В данном случае советую использовать Protected-наследование.
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 08.11.2010, 14:57   #3
Azartov
 
Регистрация: 08.11.2010
Сообщений: 3
По умолчанию

Это лабараторная работа...
И в задании сказано, что для решения этой проблеммы нужно использовать возможность восстановления уровня доступа к компонентам базового класса.

Я понимаю, что такая возможность абсурдна, но видимо есть. На лекции нам говорили, что для этого нужно испльзовать оператор расширения области видимости - "::".
Но строчка
Derived::i = i1;
не проходит.
Хотя при публичном наследовании Derived от Derived_1 сама конструкция
Derived::i = i1;
возможна, но тождественна
i = i1.
Azartov вне форума Ответить с цитированием
Старый 08.11.2010, 15:22   #4
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

А, ну так бы сразу и сказали.
Код:
class Derived : private Base
{
	private:
	float f;
	public:
	using Base::i;
	Derived();
	Derived(int i1, long l1, float f1);
	friend ostream& operator<< (ostream& os, Derived& D);
};
Или тот же using, но в protected секции.
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 11.11.2010, 20:57   #5
Azartov
 
Регистрация: 08.11.2010
Сообщений: 3
По умолчанию

Спасибо.........................
Azartov вне форума Ответить с цитированием
Старый 03.07.2011, 16:02   #6
lirik90
 
Регистрация: 17.11.2010
Сообщений: 4
По умолчанию А как обратиться к полям класса из функции?

Всем привет)
Помогите пжл оч надо.

Код:
void myfunc();

class myclass {
 public:
  myclass();
  int myparam;
};

void myfunc() {
 myclass::myparam = 10; //неа :'(
}
lirik90 вне форума Ответить с цитированием
Старый 03.07.2011, 16:49   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а где у вас объект класса что обратится к его члену?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.07.2011, 17:17   #8
lirik90
 
Регистрация: 17.11.2010
Сообщений: 4
По умолчанию

Ой далеко(((
Он в функции класса главного окна программы, и то если повезет(может класс вообще никогда не объявится)
сам класс в статистической библиотеке, вместе с формой откуда и надо получить доступ к чему либо в классе.

Код:
//class.h
void myfunc();

class myclass {
 public:
  myclass();
  int myparam;
  void myfunc1(); 
  static void myfunc2(); 
};
Код:
//class.cpp
void myfunc() {
 myclass::myparam = 10; //неа :'(
}
void myclass::myfunc1() {
 myparam = 10; //неа :'(
}
void myclass::myfunc2() {
 myparam = 10; //говорит Member myclass::myparam cannot be used without an object
 myfunc1() ; //говорит Use . or -> to call 'myclass::myfunc1()'
}
Код:
//form.cpp
#include "class.h"

__fastcall TForm::TForm(TComponent* Owner) : TForm(Owner) {
 myclass::myparam = 1; //так говорит Member myclass::myparam cannot be used without an object
 myclass::myfunc1(); //говорит Use . or -> to call 'myclass::myfunc1()'
 myclass::myfunc2();
}
lirik90 вне форума Ответить с цитированием
Старый 03.07.2011, 17:20   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

так я не вижу у вас конкретного объекта этого класса?
Код:
myclass o;
o.mufunc1();
o.myparam=5;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.07.2011, 17:31   #10
lirik90
 
Регистрация: 17.11.2010
Сообщений: 4
По умолчанию

я же сказал что мне надо обратится не через объект.
объявляется экземпляр класса в главном окне программы, весь фрагмент кода который я привожу находится в библиотеке и сам экземпляр вообще никогда не увидит.
lirik90 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как из класса B обратиться к классу A, владеющему классом B? Ferrum26 Общие вопросы Delphi 14 24.06.2010 09:46
Создание своего класса на основе базового TControl Lich87 Общие вопросы C/C++ 1 22.06.2010 18:29
Передать массив базового абстрактного класса функциям производных классов mishutka999 Общие вопросы C/C++ 2 01.12.2009 14:08
Как обратиться к объекту формы из другого класса java micha-r Общие вопросы по Java, Java SE, Kotlin 1 03.10.2009 21:07
Метод к полям класса; vovunisaev Общие вопросы C/C++ 2 08.04.2009 14:19