Чтобы определить класс или структуру, компилятор должен знать, насколько велика каждая переменная-член класса. Это непротиворечивое заявление. Я только видел, что он используется для указателей и (реже) ссылок.
Помимо этого, то, что вы пытаетесь сделать здесь, не может быть выполнено. Вы не можете иметь класс A, содержащий объект другого класса B, который содержит объект класса A. Вы можете, однако, класс А содержит указатель для класса B, который содержит объект класса A.
B.каст
#include "B.h"
void B::SomeFunction()
{
}
B.h
#ifndef __B_h__ // idempotence - keep header from being included multiple times
#define __B_h__
#include "A.h"
class B
{
public:
A a;
void SomeFunction();
};
#endif // __B_h__
хиджры
#ifndef __A_h__ // idempotence - keep header from being included multiple times
#define __A_h__
#include "B.h"
class B; // forward declaration
struct A
{
B *b; // use a pointer here, not an object
};
#endif // __A_h__
Две точки. Во-первых, не забудьте использовать некоторую форму идемпотенции, чтобы держать заголовки включенными несколько раз в единицу компиляции. Во-вторых, поймите, что в C++ единственное различие между классами и структурами - это уровень видимости по умолчанию - классы по умолчанию используют конфиденциальную видимость, а по умолчанию структура использует общедоступную видимость. Следующие определения функционально эквивалентны в C++.
class MyClass
{
public: // classes use private visibility by default
int i;
MyClass() : i(13) { }
};
struct MyStruct
{
int i;
MyStruct() : i(13) { }
};
Можете ли вы поместить их в один заголовочный файл? Я знаю, что это не особенно технический ответ, но вы могли бы избежать всего этого, выполнив это, если это осуществимо. – ihtkwot
Неважно, если вы поместите оба определения классов в один и тот же заголовочный файл, все равно нужно прийти первым и не знать размер другого класса. – Peter
спасибо за разъяснение, я все еще очень новичок в этом и надеялся, что я не предлагаю плохой совет, который я был – ihtkwot