LINUX.ORG.RU

Передача ссилки на себя в конструктор внутреннего поля C++

 ,


0

1

есть два файла, соответственно два класа:

//a.h

class A {

A(B *b) {

}

}

//b.h

#include «a.h»

class B {

A a = new A(this);

}

из a.h не видно клас B, а если прописать include «b.h» в a.h, будет рекурсивный include

что делать? может есть какаято литература про ето?



Последнее исправление: burbokop (всего исправлений: 2)
Ответ на: комментарий от burbokop

Так тело конструктора в a.cpp вынеси а в нем b.h уже подключай и используй поля как хочешь

lberserq
()
Ответ на: комментарий от Kronick

Здесь на лицо непонимание основ. А от CRTP может и крышу снести.

rupert ★★★★★
()

из a.h не видно клас B, а если прописать include «b.h» в a.h, будет рекурсивный include

что делать? может есть какаято литература про ето?

Гуарды вокруг заголовочных файлов надо писать:

#ifndef A_HPP_
#define A_HPP_

...

#endif

А ещё молодым и неокрепшим лучше не делать в заголовочных файлах определения, только объявления.

А ещё в этом вашем c++ заголовочные файлы носят расширение .hpp, от незнания мало кто использует.

Bfgeshka ★★★★★
()

может есть какаято литература про ето

Любая книга с основами С++

что делать?

Использовать препроцессорные гуарды и объявления классов

//a.h                                                                                                     
                                                                                                          
#ifndef A_H                                                                                               
#define A_H                                                                                               
                                                                                                          
#include "b.h"                                                                                            
                                                                                                          
class B;                                                                                                  
                                                                                                          
class A {                                                                                                 
public:                                                                                                   
    A(B* b) {}                                                                                            
};                                                                                                        
                                                                                                          
#endif //A_H

//b.h

#ifndef B_H
#define B_H

#include "a.h"

class B { 
    A* a = new A(this);
};

#endif //B_H

Еще у тебя синтаксические ошибки в коде

Rot1
()
Ответ на: комментарий от Bfgeshka

лучше не делать в заголовочных файлах определения, только объявления

Запись типа «class A {};» является определяющим объявлением класса, если нужно только объявить класс, то пишут просто «class A;». Ошибка повторного определения не возникает, так как классы имеют внутреннюю компоновку. Поэтому тут вы не правы.

А суффикс .hpp вообще носит рекомендательный характер, как и .hxx. Стандартом дефакто является .h для С++.

Rot1
()
Ответ на: комментарий от Rot1

А суффикс .hpp вообще носит рекомендательный характер, как и .hxx. Стандартом дефакто является .h для С++.

Ну и что, теперь нормально не писать? Есть .c и .h, а есть .cpp и .hpp. В заголовочных файлах иногда есть совместимость с С - тогда можно называть .h, в противном случае извини-подвинься.

Ошибка повторного определения не возникает, так как классы имеют внутреннюю компоновку. Поэтому тут вы не правы.

Я не говорил, что это ошибко. Было сказано, что лучше не надо.

Bfgeshka ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.