2012-05-20 2 views
1

У меня проблемы с C++ и вложенными классами. Например:Проблема с вложенными классами C++

в main.cpp

int main() 
{ 

B b(par); 
cout << b.Aglobal->parametro; 
cout << b.Aglobal->parametro; 
return 0;} 

В B.cpp

B: B(type par) 
{ 

A a(par1,par2); 
Aglobal=&a;} 

в B.h

class B 
{ 
public: 
    B(type); 
    A *Aglobal;} 

в хиджры


Основные эхо-сигналы main.cpp разные, и я не могу раскрыть причину.

+0

Egads! Исходя из предположения, что вы новичок в c-подобных языках, я хотел бы предложить вам изучить множество стилей для дуэли и выбрать более общий. Пожалуйста. Даже GNU. – dmckee

ответ

3

Вы определяете локальную переменную типа A в конструкторе B и возвращаете указатель на эту локальную переменную. Использование этого указателя приводит к неопределенному поведению, потому что объект, на который он указывает, больше не существует.

Решения проблемы могут включать в себя:

  • выделить Объект в куче. Но затем попробуйте обернуть его соответствующим умным указателем, а не простым указателем.

  • У члена типа А в В и возвратить адрес члена

  • Есть объект типа А со статической продолжительностью хранения, как и сам указатель.

Решение этих трех факторов в значительной степени зависит от контекста вашей проблемы, которая не выводима из вашего вопроса.

Еще одна вещь. Вложенные классы - это те классы, которые определены в области действия другого класса. В вашем примере нет вложенных классов.

+0

Итак, может ли что-то подобное в B.cpp решить проблему? A * a = новый A (par1, par2); Aglobale = a; и чем в main.cpp, я буду использовать cout << b.Aglobal-> parametro; – Antoz87

+0

@ Antoz87: Да, это решило бы это. –

+0

Большое спасибо. – Antoz87

0

В конструкторе B вы сохраняете адрес локальной переменной. Есть несколько способов исправить это, правильный зависит от того, что вы пытаетесь сделать с A.

Кроме того, у вас нет вложенного класса. Вложенный класс определяется внутри другого класса следующим образом:

class OuterClass { 
    class InnerClass { 
     //class members 
    }; 

    //class members 
}; 
+0

Например, как я могу это исправить? какие разные решения существуют для разных применений A? – Antoz87

Смежные вопросы