class A; // forward A
class B
{
A aa;
}
class A
{
B bb;
}
Получение переменной из класа
Я делал так: в UserDialog.cpp я подцепляю инклудем заголовочный файл ICQClient2Dlg.h, создаю переменную типа CICQClient2Dlg и с помощью этой переменной пытаюсь достать необходимые данные.
Но все оказалось не так просто. в модуле CICQClient2Dlg.cpp также была объявлена переменная но уже типа CUserDialog т.е. получилось некое "перекрестное объявление" и программа перестала компилироваться вышел из этой ситуации я закоментировав так:
CICQClient2Dlg::CICQClient2Dlg(CWnd* pParent /*=NULL*/)
: CDialog(CICQClient2Dlg::IDD, pParent)
{
//m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
и следовательно иконка на форме неотображается (однако это еще пол беды)
Программа запустилась но в этой переменной оказывается не то значение
Жду ваших коментариев по поводу правильности моих действий.
ЗЫ А может я слишком мудрю и есть способ по проще.
Цитата:
Originally posted by Rad87
Программа запустилась но в этой переменной оказывается не то значение
Программа запустилась но в этой переменной оказывается не то значение
Похоже, что у тебя создается 2 объекта
Выложи побольше кода, а то маловато информации к размышлению.
Я в файле ICQClient2Dlg.cpp передаю в переменную Sock из класса СUserDialog адрес переменной типа CSocket
UserDialog.Sock=&sClient;
И тем самым добился передачи значения. Но помоему это все полу меры. И мне бы хотелось узнать как вообще вы передаете значение переменной из одного класса в другой. И вообще правильный ли я выбрал путь передачи значений.
Код:
// Вышепреведенный код никогда не скопилится, а если и скомпилится(кривость компилятора) то зависнет при объявлении екземпляра либо A либо B
Вот что надо
Код:
class A; // forward A
class B
{
A *aa;
B():aa(NULL){};
void Init{ aa = new A;}
}
class A
{
B *bb;
A():bb(NULL){}
void Init{ bb = new B;}
}
class B
{
A *aa;
B():aa(NULL){};
void Init{ aa = new A;}
}
class A
{
B *bb;
A():bb(NULL){}
void Init{ bb = new B;}
}
Сейчас попробую.
Цитата:
Originally posted by Alexandoros
Код:
class A; // forward A
class B
{
A *aa;
B():aa(NULL){};
void Init{ aa = new A;}
}
class A
{
B *bb;
A():bb(NULL){}
void Init{ bb = new B;}
}
class B
{
A *aa;
B():aa(NULL){};
void Init{ aa = new A;}
}
class A
{
B *bb;
A():bb(NULL){}
void Init{ bb = new B;}
}
IMHO это не правильно.
А создает свой экземпляр В, а В создает свой экземпляр А.
В от А не видит А от В - ВСЕ указатели указывают на разные обьекты
Вот так будет работать
Код:
class A; // forward A
class B
{
TypeB VarClassB;
A *aa;
public:
B():aa(NULL){}
void Init( А* рА ){ aa = рA;}
TypeB GetVarB() const {return VarClassB; } // Выдает свою
TypeA GetVarA() const {return pA->GetVarA(); } // Вытаскивает из А
}
class A
{
B *bb;
TypeA VarClassA;
public:
A():bb(NULL){}
void Init(В* рВ ){ bb = pB;}
TypeA GetVarA() const {return VarClassA; } // Выдает свою
TypeB GetVarB() const {return pB->VarClassB; } // Вытаскивает из B
}
A MyA;
B MyB;
MyA.Init( &MyB );
MyB.Init( &MyA );
class B
{
TypeB VarClassB;
A *aa;
public:
B():aa(NULL){}
void Init( А* рА ){ aa = рA;}
TypeB GetVarB() const {return VarClassB; } // Выдает свою
TypeA GetVarA() const {return pA->GetVarA(); } // Вытаскивает из А
}
class A
{
B *bb;
TypeA VarClassA;
public:
A():bb(NULL){}
void Init(В* рВ ){ bb = pB;}
TypeA GetVarA() const {return VarClassA; } // Выдает свою
TypeB GetVarB() const {return pB->VarClassB; } // Вытаскивает из B
}
A MyA;
B MyB;
MyA.Init( &MyB );
MyB.Init( &MyA );
Здесь по одному экземпляру каждого класса
и эти 2 выражения эквивалентны по результату
Код:
TypeA MyVarA1 = MyA.GetVarA();
TypeA MyVarA2 = MyB.GetVarA();
TypeA MyVarA2 = MyB.GetVarA();
В обоих случаях обращаешься к одной и той же переменной одного и того же объекта
Цитата:
Originally posted by dinasok51
IMHO это не правильно.
А создает свой экземпляр В, а В создает свой экземпляр А.
В от А не видит А от В - ВСЕ указатели указывают на разные обьекты
Вот так будет работать
Здесь по одному экземпляру каждого класса
и эти 2 выражения эквивалентны по результату
В обоих случаях обращаешься к одной и той же переменной одного и того же объекта
IMHO это не правильно.
А создает свой экземпляр В, а В создает свой экземпляр А.
В от А не видит А от В - ВСЕ указатели указывают на разные обьекты
Вот так будет работать
Код:
class A; // forward A
class B
{
TypeB VarClassB;
A *aa;
public:
B():aa(NULL){}
void Init( А* рА ){ aa = рA;}
TypeB GetVarB() const {return VarClassB; } // Выдает свою
TypeA GetVarA() const {return pA->GetVarA(); } // Вытаскивает из А
}
class A
{
B *bb;
TypeA VarClassA;
public:
A():bb(NULL){}
void Init(В* рВ ){ bb = pB;}
TypeA GetVarA() const {return VarClassA; } // Выдает свою
TypeB GetVarB() const {return pB->VarClassB; } // Вытаскивает из B
}
A MyA;
B MyB;
MyA.Init( &MyB );
MyB.Init( &MyA );
class B
{
TypeB VarClassB;
A *aa;
public:
B():aa(NULL){}
void Init( А* рА ){ aa = рA;}
TypeB GetVarB() const {return VarClassB; } // Выдает свою
TypeA GetVarA() const {return pA->GetVarA(); } // Вытаскивает из А
}
class A
{
B *bb;
TypeA VarClassA;
public:
A():bb(NULL){}
void Init(В* рВ ){ bb = pB;}
TypeA GetVarA() const {return VarClassA; } // Выдает свою
TypeB GetVarB() const {return pB->VarClassB; } // Вытаскивает из B
}
A MyA;
B MyB;
MyA.Init( &MyB );
MyB.Init( &MyA );
Здесь по одному экземпляру каждого класса
и эти 2 выражения эквивалентны по результату
Код:
TypeA MyVarA1 = MyA.GetVarA();
TypeA MyVarA2 = MyB.GetVarA();
TypeA MyVarA2 = MyB.GetVarA();
В обоих случаях обращаешься к одной и той же переменной одного и того же объекта
из за обильной писанины динанскока складывается ложное впечатление об сложности задачи. см. прикрепление там все Ok. все очень просто.
Цитата:
Originally posted by Mamontoboy
из за ... динанскока ...
из за ... динанскока ...
Нечто подобное уже было совсем недавно.
Последствия могут повториться
Цитата:
Originally posted by dinasok51
Нечто подобное уже было совсем недавно.
Последствия могут повториться
Нечто подобное уже было совсем недавно.
Последствия могут повториться
га га га. а это уже офтоп. но ты первый начал.
2Matush: уж не знаю какими путями ты стал модератором (вскрытие покажет) но от Львова до Ивано-Франковска совсем недалеко. Бей Бандеровцев!!!!!!!