Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / protected переменная не доступна из класса наследника / 15 сообщений из 15, страница 1 из 1
13.02.2013, 12:21
    #38149173
MaximuS_G
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
protected переменная не доступна из класса наследника
Всем привет!
У меня есть два класса сPoint и cRectangular:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
class cPoint
{
public:
	cPoint(double, double);
	cPoint();
	~cPoint(void);
	double getLength(cPoint);
	double getX();
	double getY();
	void setX(double);
	void setY(double);
protected:
	int x;
	int y;
};

class cRectangular:public cPoint
{
public:
	cRectangular(double, double, double, double);
	cRectangular();
	~cRectangular();
	double Perimeter();
	bool isInside(cPoint);
	double Square();
	int rectIntecept(cRectangular);
private:
	double height;
	double width;
};



Внутри cRectangular реализован метод isInside:
Код: plaintext
1.
2.
3.
4.
bool cRectangular::isInside(cPoint point)
{
	return point.x>=x && point.x<=x1 && point.y>=y && point.y<=y1; // why is point.x\y inaccessible?
}



Вопрос в том, почему поля x и y класса сPoint не доступны в методе isInside класса cRectangular? Они ведь объявлены как protected в родительском классе сPoint, а значит должны быть доступны в классе наследнике cRectangular.

Заранее спасибо!
...
Рейтинг: 0 / 0
13.02.2013, 12:24
    #38149184
Паганель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
protected переменная не доступна из класса наследника
попробуйте для теста написать this->x и this->y
...
Рейтинг: 0 / 0
13.02.2013, 12:48
    #38149264
Abstraction
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
protected переменная не доступна из класса наследника
Точный текст сообщения об ошибке можно? Лично меня здорово смущают x1 и y1.
...
Рейтинг: 0 / 0
13.02.2013, 13:02
    #38149293
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
protected переменная не доступна из класса наследника
MaximuS_Gпочему поля x и y класса сPoint не доступны в методе isInside класса
cRectangular?
Потому что они принадлежат другому экземпляру. Protected поля не видны "снаружи" никому,
даже другим экземплярам того же класса. За исключением друзей, но это отдельная тема.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.02.2013, 13:06
    #38149302
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
protected переменная не доступна из класса наследника
MaximuS_G,
не доступны поля экземпляра point, переданного входным параметром в функцию. ну и что тут удивительного? это внешний, по отношению к cRectangular объект, никак не связанный с ним. и тот факт, что cRectangular наследуется от cPoint никак на это не влияет. Тем более, что в классе cPoint есть геттеры для этих полей, и какая религия запрещает их вам использовать, общественности не понятно
...
Рейтинг: 0 / 0
13.02.2013, 13:24
    #38149351
Abstraction
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
protected переменная не доступна из класса наследника
Dimitry SibiryakovMaximuS_Gпочему поля x и y класса сPoint не доступны в методе isInside класса
cRectangular?
Потому что они принадлежат другому экземпляру. Protected поля не видны "снаружи" никому,
даже другим экземплярам того же класса. За исключением друзей, но это отдельная тема.
Того же класса - видны.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
class Base {
protected:
	int m_data;
public:
	static int getData(const Base& b) {return b.m_data;}
};

class Derived : public Base {
public:
	int getData(void) const {return m_data;};

	static int getBaseData(const Base& b) {return b.m_data;}//Ошибка.
	static int getDerivedData(const Derived& b) {return b.m_data;}
};

Странное ограничение, кстати. Реально, как можно видеть, ни от чего не защищает, а проблемы создаёт.
...
Рейтинг: 0 / 0
13.02.2013, 15:27
    #38149707
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
protected переменная не доступна из класса наследника
авторDimitry SibiryakovMaximuS_Gпочему поля x и y класса сPoint не доступны в методе isInside класса
cRectangular?
Потому что они принадлежат другому экземпляру. Protected поля не видны "снаружи" никому,
даже другим экземплярам того же класса. За исключением друзей, но это отдельная тема.


Это не так в С++.
Это так только в smalltalk.

Тут члены должны быть доступны, автор просто что-то попутал.
...
Рейтинг: 0 / 0
13.02.2013, 15:53
    #38149761
Abstraction
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
protected переменная не доступна из класса наследника
MasterZivЭто не так в С++.
Это так только в smalltalk.

Тут члены должны быть доступны, автор просто что-то попутал.Вот мне тоже казалось, что должны. Но студия 2010 в примере выше со мной не согласилась, причём именно с формулировкой "error C2248: 'Base::m_data' : cannot access protected member declared in class 'Base' ".
...
Рейтинг: 0 / 0
13.02.2013, 16:16
    #38149824
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
protected переменная не доступна из класса наследника
AbstractionВот мне тоже казалось, что должны. Но студия 2010 в примере выше со мной
не согласилась
И что неприятно - BCC с ней солидарен.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.02.2013, 16:19
    #38149829
Abstraction
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
protected переменная не доступна из класса наследника
Dimitry SibiryakovAbstractionВот мне тоже казалось, что должны. Но студия 2010 в примере выше со мной
не согласилась
И что неприятно - BCC с ней солидарен.
Да как бы стандарт (2003, по крайней мере) с ней солидарен. Есть там такое мерзкое ограничение на доступ к protected-членам, логику которого я не вполне понимаю.
...
Рейтинг: 0 / 0
13.02.2013, 17:38
    #38150004
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
protected переменная не доступна из класса наследника
Что-то не то.
Без доступа к защищенным членам других экземпляров нельзя реализовать конструктор копирования и присвоение.
Можно цитату из стандарта?
...
Рейтинг: 0 / 0
13.02.2013, 17:43
    #38150012
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
protected переменная не доступна из класса наследника
А, все правильно.
Разрешен доступ к защищенным членам того же самого класса, но не к предку, даже если это предок из которого унаследованы эти члены.
...
Рейтинг: 0 / 0
13.02.2013, 17:57
    #38150046
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
protected переменная не доступна из класса наследника
А если конкретно по данному коду, то вот это нонсенс:
Код: plaintext
1.
class cRectangular:public cPoint


Наследование это отношение "является".
А прямоугольник никак не является точкой.
Исправьте это и сразу отпадет необходимость лезть во внутренности точки из кода прямоугольника.
...
Рейтинг: 0 / 0
13.02.2013, 23:18
    #38150403
MaximuS_G
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
protected переменная не доступна из класса наследника
Всем большое спасибо, теперь все понятно!
Anatoly Moskovsky Наследование это отношение "является".
А прямоугольник никак не является точкой.
Исправьте это и сразу отпадет необходимость лезть во внутренности точки из кода прямоугольника.
Такое домашнее задание задают :)
...
Рейтинг: 0 / 0
15.02.2013, 02:03
    #38152161
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
protected переменная не доступна из класса наследника
class A
{
firend class B;
protected:
int aa;
}

class B: public class A
{
}
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / protected переменная не доступна из класса наследника / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]