Модератор: Модераторы разделов
billygates
Сообщения: 3
ОС: Ubuntu
Сообщение
billygates » 03.01.2010 19:53
Собственно, требуется, чтобы базовый класс мог создавать экземпляр своего потомка. 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
Сообщение
RasenHerz » 03.01.2010 23:53
P.S. интересует, чтобы возвращался простой экземпляр, а не указатель или ссылка на него.
А как прикажете вычислять размер классов компилятору?
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.
Сообщение
Crazy » 03.01.2010 23:56
Не въезжаю в код. В чем идея?
Desipere in loco
billygates
Сообщения: 3
ОС: Ubuntu
Сообщение
billygates » 04.01.2010 00:15
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
Сообщение
billygates » 04.01.2010 00:21
Собственно изначальный вопрос решен. Но возник другой вопрос. Почему, если сделать так:
Код: Выделить всё
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
Сообщение
RasenHerz » 04.01.2010 01:28