C++: forward declaration

Модератор: Модераторы разделов

billygates
Сообщения: 3
ОС: Ubuntu

C++: forward declaration

Сообщение billygates »

Собственно, требуется, чтобы базовый класс мог создавать экземпляр своего потомка. g++ выдает следующую ошибку:

Код: Выделить всё

6: error: invalid use of incomplete type ‘struct Base’
3: error: forward declaration of ‘struct Base’


Ведь каким-то же образом умеет QDomNode кастить себя к QDomElement, который является его потомком.
Что я делаю в этом коде не так? Спасибо.

P.S. интересует, чтобы возвращался простой экземпляр, а не указатель или ссылка на него.

Код: Выделить всё

class Base;

class Derived : private Base
{
    public:
        Derived() {}
};

class Base
{
    public:
        Base() {}
        Derived asDerived() { return Derived(); }
};



int main(int argc, char* argv)
{
    return 0;
}
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: C++: forward declaration

Сообщение RasenHerz »

P.S. интересует, чтобы возвращался простой экземпляр, а не указатель или ссылка на него.

А как прикажете вычислять размер классов компилятору?
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: C++: forward declaration

Сообщение Crazy »

Не въезжаю в код. В чем идея?

Desipere in loco
Спасибо сказали:
billygates
Сообщения: 3
ОС: Ubuntu

Re: C++: forward declaration

Сообщение billygates »

RasenHerz писал(а): ↑
03.01.2010 23:53
P.S. интересует, чтобы возвращался простой экземпляр, а не указатель или ссылка на него.

А как прикажете вычислять размер классов компилятору?

путем разделения на логические единицы и разделение определений и реализаций. Решение найдено, в конце сообщения.

Crazy писал(а): ↑
03.01.2010 23:56
Не въезжаю в код. В чем идея?

делать cast к экземпляру дочернего класса с сохранением значений всех полей базового класса. Так, например, сделано в QtXml/QDomNode -- правда там это реализовано с использованием D-указателей.


Вопрос решен. Требуется разделить данный файл на две логические единицы:
base.h

Код: Выделить всё

class Derived;

class Base
{
    public:
        Base() {}
        Derived asDerived() { return Derived(); }
};

main.cpp:

Код: Выделить всё

#include "base.h"

class Derived : private Base
{
    public:
        Derived() {}
};

Derived Base::asDerived()
{
      return Derived(); // или static_cast<Derived>(*this) -- что, в общем-то, и надо было.
}
Спасибо сказали:
billygates
Сообщения: 3
ОС: Ubuntu

Re: C++: forward declaration

Сообщение billygates »

Собственно изначальный вопрос решен. Но возник другой вопрос. Почему, если сделать так:

Код: Выделить всё

Derived* Base::asDerived()
{
     return dynamic_cast<Derived *>(new Base(*this));
}

то приложение валится с SEGFLT? Неужели не срабатывает конструктор копирования Base для создание собственной копии?

И почему работает так, если возвращать измененный указатель на экземпляр Base:

Код: Выделить всё

Derived* Base::asDerived()
{
     return static_cast<Derived *>(this);
}

но не работает, если используется dynamic_cast вместо static_cast? И чем чревато использование static_cast в данном примере, вместо динамического приведения?
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: C++: forward declaration

Сообщение RasenHerz »

Спасибо сказали: