Виртуальный конструктор, С++
#include <iostream>
#include <string>
using namespace std;
class vera;
class vasa;
class artem {
public:
artem(): art(NULL) {
} artem(istream & io) {
string s;
io >> s;
switch (constr(s)) {
case VERA:
art = new vera(s);
break;
case VASA:
art = new vasa(s);
break;
}
}
virtual ~artem()
{delete art;}
virtual void show() {
art->show();
}
virtual void set(string ch) {
art->set(ch);
}
private:
artem * art;
enum ludi { VERA, VASA };
ludi constr(string ss) {
if (ss == "VERA")
return VERA;
else if (ss == "VASA")
return VASA;
else
cout << "Takogo net" << endl;
exit(0);
}
};
class vera:public artem {
string name;
public:
vera(): artem(){}
vera(string cc): artem(), name(cc){}
void show() {
cout << name << endl;
}
void set(string ch) {
name = ch;
}
};
class vasa:public artem {
string name;
public:
vasa(): artem(){}
vasa(string cc): artem(), name(cc){}
void show() {
cout << name << endl;
}
void set(string ch) {
name = ch;
}
};
Вот решил поупражнятся по памяти над темой "виртуальных конструкторов", но что-то не так, имеется вышеуказанный код, но выдается ошибка vera: не имеет конструкторов vasa не имеет конструкторов, подскажите, чего я тут напортачил. Спасибо.
кому интересно, вот результат проб и ошибок:) проблема оказалась в том, что опереждающее обьявление почемуто(нужно еще осмыслить) не давало требуемого результата, решилось все путем определения конструктора базового класса после всех производных, когда они уже видны.
#include <iostream>
#include <string>
using namespace std;
class artem
{
public:
artem(): art(NULL){}
artem(istream & io);
virtual ~artem()
{
delete art;
}
virtual void show()
{
art->show();
}
virtual void set(istream &io)
{
art->set(io);
}
virtual void du(int a, int b)
{
art->du(a, b);
}
private:
enum ludi{VERA, VASA};
ludi constr(string ss)
{
if(ss=="VERA")
return VERA;
else
if(ss=="VASA")
return VASA;
else
cout<<"Takogo net"<<endl;
exit(0);
}
artem *art;
};
class vera: public artem
{
friend artem;
string name;
vera(string cc): name(cc){}
public:
void show()
{
cout<<name<<endl;
}
void set(istream &io)
{
string s;
io>>s;
name=s;
}
void du(int a, int b)
{
cout<<a+b<<endl;
}
};
class vasa: public artem
{
friend artem;
string name;
vasa(string cc): name(cc){}
public:
void show()
{
cout<<name<<endl;
}
void set(istream &io)
{
string s;
io>>s;
name=s;
}
void du(int a, int b)
{
cout<<a*b<<endl;
}
};
artem::artem(istream &io)
{
string s;
io>>s;
switch(constr(s))
{
case VERA:
art=new vera(s);
break;
case VASA:
art=new vasa(s);
break;
}
}
Теперь вот думаю взятся за прототипы, только вот ни как не соберусь. Спасибо всем за участие. Удачи.