Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Получение переменной из класа

1.9K
20 декабря 2005 года
Rad87
123 / / 14.12.2005
Проблема заключается в том что мне необходимо значение из переменной (CSocket) находящейся в классе CICQClient2Dlg (объявлена в Public)получить в классе CUserDialog.

Я делал так: в UserDialog.cpp я подцепляю инклудем заголовочный файл ICQClient2Dlg.h, создаю переменную типа CICQClient2Dlg и с помощью этой переменной пытаюсь достать необходимые данные.

Но все оказалось не так просто. в модуле CICQClient2Dlg.cpp также была объявлена переменная но уже типа CUserDialog т.е. получилось некое "перекрестное объявление" и программа перестала компилироваться вышел из этой ситуации я закоментировав так:


CICQClient2Dlg::CICQClient2Dlg(CWnd* pParent /*=NULL*/)
: CDialog(CICQClient2Dlg::IDD, pParent)
{
//m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

и следовательно иконка на форме неотображается (однако это еще пол беды)

Программа запустилась но в этой переменной оказывается не то значение

Жду ваших коментариев по поводу правильности моих действий.

ЗЫ А может я слишком мудрю и есть способ по проще.
2.4K
21 декабря 2005 года
dinasok51
219 / / 12.11.2005
Цитата:
Originally posted by Rad87
Программа запустилась но в этой переменной оказывается не то значение



Похоже, что у тебя создается 2 объекта
Выложи побольше кода, а то маловато информации к размышлению.

1.9K
21 декабря 2005 года
Rad87
123 / / 14.12.2005
В общем проблему я решил.

Я в файле ICQClient2Dlg.cpp передаю в переменную Sock из класса СUserDialog адрес переменной типа CSocket

UserDialog.Sock=&sClient;

И тем самым добился передачи значения. Но помоему это все полу меры. И мне бы хотелось узнать как вообще вы передаете значение переменной из одного класса в другой. И вообще правильный ли я выбрал путь передачи значений.
398
22 декабря 2005 года
Alexandoros
630 / / 21.10.2005
Ты никогда не создаш 2 класа, которые имеют переменные члены типа друг друга. Проблема решеатся только через указатели.

Код:
class A; // forward A

class B
{
   A aa;
}

class A
{
  B bb;
}


// Вышепреведенный код никогда не скопилится, а если и скомпилится(кривость компилятора) то зависнет при объявлении екземпляра либо 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;}
}
1.9K
22 декабря 2005 года
Rad87
123 / / 14.12.2005
Спасибо за пример!!!!!!!
Сейчас попробую.
2.4K
23 декабря 2005 года
dinasok51
219 / / 12.11.2005
Цитата:
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;}
}



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 );


Здесь по одному экземпляру каждого класса
и эти 2 выражения эквивалентны по результату
 
Код:
TypeA MyVarA1 = MyA.GetVarA();
TypeA MyVarA2 = MyB.GetVarA();

В обоих случаях обращаешься к одной и той же переменной одного и того же объекта
11K
23 декабря 2005 года
Mamontoboy
37 / / 23.12.2005
Цитата:
Originally posted by dinasok51
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 );


Здесь по одному экземпляру каждого класса
и эти 2 выражения эквивалентны по результату
 
Код:
TypeA MyVarA1 = MyA.GetVarA();
TypeA MyVarA2 = MyB.GetVarA();

В обоих случаях обращаешься к одной и той же переменной одного и того же объекта



из за обильной писанины динанскока складывается ложное впечатление об сложности задачи. см. прикрепление там все Ok. все очень просто.

2.4K
23 декабря 2005 года
dinasok51
219 / / 12.11.2005
Цитата:
Originally posted by Mamontoboy
из за ... динанскока ...


Нечто подобное уже было совсем недавно.
Последствия могут повториться

11K
23 декабря 2005 года
Mamontoboy
37 / / 23.12.2005
Цитата:
Originally posted by dinasok51
Нечто подобное уже было совсем недавно.
Последствия могут повториться



га га га. а это уже офтоп. но ты первый начал.

2Matush: уж не знаю какими путями ты стал модератором (вскрытие покажет) но от Львова до Ивано-Франковска совсем недалеко. Бей Бандеровцев!!!!!!!

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог