LINUX.ORG.RU

Упреждающее объявление класса


0

0

Доброго времени суток всем. Вот вылезла проблема - сижу, туплю. G++ не видит упреждающего (предварительного) объявления класса. В примере вида class test;

class other

{

private:

test* pt;

public:

other() : pt(new test) {}

~other() { delete pt; }

void func(void) { pt->another(); }

};

class test

{

public:

test() {;}

~test() {;}

void another(void) { std::cout<<"test::another()"<<std::endl; }

};

говорит, что не знает "test" в "other() : pt(new test) {}" и далее. Подскажите, куда копать?

anonymous

ИМХО для new test forward declaration недостаточно. Вынеси реализацию конструктора и деструктора в cpp файл и там сделай инклуд.

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

Ща попробую. Выкопал в инете про какие-то проблемы гыцыца с упреждающими объявлениями...

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

Не помогло, точнее, теперь ругается линкер на то, что не может найти ни конструктора other, ни деструктора, ни функции. Сижу, туплю...

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

Всё, разобрался, пришлось в Makefile отдельные цели делать для сборки main.cpp и test.cpp + test.h. А что, в одном файле - вообще не вариант так сделать?

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

Ну, стиль стилем, а в качестве примера - удобно.

anonymous
()

#include <iostream>

class test;

class other 
{ 
private: 
  test* pt; 

public: 
  other();
  ~other();
  void func();
}; 

class test 
{ 
public: 
  test() { } 
  ~test() { } 
  void another() { std::cout<<"test::another()"<<std::endl; } 
};

other::other() : pt(new test) { } 
other::~other() { delete pt; } 
void other::func()  { pt->another(); } 

Begemoth ★★★★★
()

Дело тут в том что при упреждающем объявлении класса компилятор ничего не знает про его размер, а для new обязательно надо знать размер типа.
на примере, следующий код правильный:

class B;

class A {
B *bPtr;
}

class B {
int b;
}


а следующий не скомпилится:

class B;

class A {
B b;
}

class B {
int b;
}

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