Можно ли использовать шаблон шаблона шаблона в конструкторе?

Возможный дубликат:
Вызов виртуальных функций внутри конструкторов

У меня есть класс Shape и его подкласс Sphere:

//Shape :

class Shape
{
public:
Shape(const string& name);
virtual ~Shape();

virtual string getName();

protected:

string mName;

};

Shape::Shape(const string& name) : mName(name)
{
/*Some stuff proper to Shape*/

/*Some stuff proper to subclass (sphere)*/

/*Some stuff proper to Shape*/
}

Shape::~Shape(){}

string Shape::getName(){ return mName; }//Sphere :

class Sphere : public Shape
{
public:
Sphere(const string& name, const float radius);
virtual ~Sphere();

virtual string getRadius();

protected:

float mRadius;
}

Sphere::Sphere(const string& name, const float radius) : Shape(name), mRadius(radius)
{
/*Some stuff*/
}

Sphere::~Sphere(){}

float Sphere::getRadius(){ return mRadius; }

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

редактировать :

Я решил переместить конструктор в новый метод, init, и виртуальный метод будет subInit:

//Shape :

class Shape
{
public:
Shape(const string& name);
virtual ~Shape();

virtual string getName();

virtual void init();

protected:

string mName;

virtual void subInit() = 0;

};

Shape::Shape(const string& name) : mName(name){}

Shape::~Shape(){}

string Shape::getName(){ return mName; }

void Shape::init()
{
/*Some stuff proper to Shape*/

/*Some stuff proper to subclass (sphere)*/
/*Call to the pure virtual function subInit*/

subInit();

/*Some stuff proper to Shape*/
}

//Sphere :

class Sphere : public Shape
{
public:
Sphere(const string& name, const float radius);
virtual ~Sphere();

virtual string getRadius();

protected:

float mRadius;

void subInit();
}

Sphere::Sphere(const string& name, const float radius) : Shape(name),mRadius(radius)
{}

Sphere::~Sphere(){}

float Sphere::getRadius(){ return mRadius; }

Sphere::subInit()
{
/*Some stuff previously in the constructor*/
}

Это в основном шаблонный шаблон

Клиент напишет:

Shape* sphere = new Sphere();
sphere->init();

Тогда у меня есть ответ: невозможно применить этот шаблон в конструкторе, по крайней мере, в C ++

3

Решение

Shape::Shape(const string& name) : mName(name)
{
/*Some stuff proper to Shape*/

/*Some stuff proper to subclass (sphere)*/

/*Some stuff proper to Shape*/
}

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

Shape::Shape(const string& name) : mName(name)
{
/*Some stuff proper to Shape*/
}

void Shape::finishConstruction()
{
/*Some stuff proper to Shape*/
}

Sphere::Sphere(const string& name, const float radius)
: Shape(name), mRadius(radius)
{
/*Some stuff proper to subclass (sphere)*/

finishConstruction();
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]