Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Доступ к членам класса родителя из класса, ребенка(используя скрытую реализацию) 
:(
    Опции темы
Royan
  Дата 17.5.2004, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: нет
Всего: 15



Допустим имеем:

Код
class Parent{
public:
 Parent();
 int nVal;
 Child ch();
};

class Child : public Parent{
public:
  Child(){}
  foo(){
    //здесь надо получить значение nVal
  }
};

....

Parent prnt();

prnt.nVal=100;


Могу ли я теперь внутри "ch.foo()" заполучить значение "prnt.nVal" не прибегая к глобальным переменным, и не воодя доп. поля в классе Child?

Это сообщение отредактировал(а) Royan - 17.5.2004, 21:48


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
sergejzr
Дата 17.5.2004, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Код
void foo(){
   //здесь надо получить значение nVal
  int x=Parent::nVal;
 }

Добавлено @ 22:28
Только странности какие то в коде у тебя...
Во первых доступ public, а значит вообще пойдёт
Код
void foo(){
  //здесь надо получить значение nVal
 int x=nVal;
//или
x=this->nVal;
}

Для решения вышеописанной проблемы, лучше задекларировать protected.


Во вторых ты Обьект чилда из функции парента возвращаешь.
довольно странный концепт.
К тому же это сделать невозможно. Можно возвратить указатель.

Ну наверное сам разберёшся smile.gif.

Это сообщение отредактировал(а) sergej.z - 17.5.2004, 22:55


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
DenDen
Дата 17.5.2004, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 25.3.2004

Репутация: нет
Всего: нет



1) [censored 6] фигня получается потому, что у тебя в паренте есть чилд, а в чилде парент. Тут действительно надо явно указывать область действия.
2) Сам объект вернуть мужно, но долго
PM MAIL   Вверх
Royan
Дата 18.5.2004, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: нет
Всего: 15



Цитата
у тебя в паренте есть чилд, а в чилде парент
В этом есть смысл, возьми к примеру Класс CWnd, от него грубо говоря унаследован какой-нибудь CToolBar, тогда при реализации окна ты неизбежно включаешь реализацию объекта CToolBar внутрь CWnd. Так вот как например мне добраться до члена класса CWnd из реализации CToolBar.



--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
mr.DUDA
Дата 18.5.2004, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Цитата
тогда при реализации окна ты неизбежно включаешь реализацию объекта CToolBar внутрь CWnd

Зачем мне включать реализацию класса Child в реализацию класса Parent, если на момент написания класса Parent неизвестно, какие у него могут быть потомки ? И что, при каждом создании нового класса, производного от CWnd, мне придётся заново переписывать класс CWnd ? (так следует из цитаты).


--------------------
user posted image
PM MAIL WWW   Вверх
DenDen
Дата 18.5.2004, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 25.3.2004

Репутация: нет
Всего: нет



2 mr.DUDAd,вопрос стиля.
Мне тоже не очень понятно.

вот код, который делает все что, надо(по крайней мере как я понял)
class Child;
class Parent{
public:
Parent(){how=0;};
~Parent(){};
Child ch();
int how;
};
class Child:virtual public Parent
{
public:
Child(){};
~Child(){};
void set_how(){Parent::how=3;};
};


int main(int argc, char **argv)
{
Child ch;
cout<<ch.how<<"\n";
ch.set_how();
cout<<ch.how<<"\n";
cin>>ch.how;

return 0;
}

Это сообщение отредактировал(а) DenDen - 18.5.2004, 15:34
PM MAIL   Вверх
sergejzr
Дата 18.5.2004, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Я вроде так и написал выше..



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Royan
Дата 18.5.2004, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: нет
Всего: 15



Извиняюсь за некорректно сформулированный вопрос, но вроде я сам допер до ответа и вот, что собственно была за идея:

Нужно было при создании реализации, каким-то образом сохранить информацию процедуре обработке окна предопрделенного в виндах класса, как то BUTTON, COMBOBOX... и соответственно заменить исходную своей (спасибо за идею AndyY smile.gif )

И вопрос был где лучше сохранить инфу об этой процедуре, и вот как я решил поступить:

Цитата
class CWnd{
public:
CWnd();
Child ch();
};

class Child : public CWnd{
public:
  Child(){
    hBut= CreateWindowEx(...,BUTTON,...);
    poldChildProc = ::GetWindowLongPtr(hBut, GWLP_WNDPROC );
    ::SetWindowLongPtr(hBut, GWLP_WNDPROC, (
long)ChildWndProc);
    
  }
 
static CALLBACK LRESULT ChildWndProc(HWND hBut, ......){
     Child *pChild = (Child *)::GetWindowLongPtr(hBut, GWLP_USERDATA);
//Это мы сохраненные еще в конструторе данные достаем
    //blah blah blah
    //Если нет обработчика события
   
return CallWindowPRoc(pChild->poldChildProc , hBut, .... );
  }
   HWND hBut;
   WNDPROC *poldChildProc;
};

Код писал из головы так что может где и ляпнул чего

Это сообщение отредактировал(а) Royan - 18.5.2004, 17:25


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0551 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.