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

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

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

zim ()
Ответ на: Re: Упреждающее объявление класса от zim

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

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

anonymous ()

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

#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 ★★★★★ ()

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

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

class B;

class A {
B *bPtr;
}

class B {
int b;
}


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

class B;

class A {
B b;
}

class B {
int b;
}

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