Класс прототипирования - PullRequest
7 голосов
/ 31 мая 2011

Я поместил несколько экземпляров класса b в класс a, но это вызывает ошибку, поскольку класс a не знает, что такое класс b.

Теперь я знаю, что могу решить эту проблему, записав свой файл b a c, но это портит достижимость и раздражает меня. Я знаю, что могу создавать прототипы своих функций, поэтому у меня нет этой проблемы, но я не смог найти материала о том, как создать прототип класса.

есть ли у кого-нибудь пример прототипирования классов в c ++.

, так как, кажется, есть некоторая путаница, позвольте мне показать вам, что я хочу

class A
{
public:

B foo[5];

};

class B
{
public:
int foo;
char bar;
}

но это не работает, так как A не может видеть B, поэтому мне нужно поместить что-то перед ними обоими, если бы это была функция, я бы поставил A (); затем реализуем это позже. Как я могу сделать это с классом.

Ответы [ 4 ]

20 голосов
/ 31 мая 2011

Вы можете объявить все свои классы и затем определить их в любом порядке, например:

// Declare my classes
class A;
class B;
class C;

// Define my classes (any order will do)
class A { ... };
class B { ... };
class C { ... };
4 голосов
/ 31 мая 2011

Вы ищете объявления.

class A;
class B {
    A MakeA();
    void ProcessA(A a);
};
class A {
    B bs[1000];
};

Если вы перешли к объявлению класса, вы можете

declare functions taking and returning it or complex types made of it
declare member variables of pointer or reference to it

Это в основном означает, что в любом случае, который не заканчиваетсяс экземплярами A внутри B и наоборот вы должны быть в состоянии объявить и определить любой интерфейс между A и B.

2 голосов
/ 31 мая 2011

Обычным способом разрешения циклических зависимостей является использование предварительного объявления:

// Bar.h

class Foo; // declares the class Foo without defining it

class Bar {
    Foo & foo; // can only be used for reference or pointer
};

// Foo.h

#include <Bar.h>

class Foo {
    Bar bar; // has full declaration, can create instance
}

Вы можете предоставить полную декларацию и определение в другом файле. Используя предварительное объявление, вы можете создавать указатели и ссылки на класс, но не можете создавать его экземпляры, так как для этого требуется полное объявление.

1 голос
/ 31 мая 2011

class b;</p> <pre> class a { public: b * inst1; }; class b{ .... }; </pre> <p>

Это то, что вам нужно?

...