读书人

急继承的有关问题

发布时间: 2013-09-06 10:17:17 作者: rapoo

急求一个继承的问题
下面的代码12行一直报错“'BaseB' : no appropriate default constructor available”,请各路大神指点一下

#include<iostream>
using namespace std;

class BaseB;
class BaseA
{
public:
static BaseA* CreateObject();
virtual void DeleteObject()=0;
};

BaseA* BaseA::CreateObject()
{
return new BaseB();
}

class BaseB : public BaseA
{
public:
BaseB(){n_numA = 0;}
~BaseB(){}
virtual void DeleteObject(){delete this;};
private:
int n_numA;
};

int main()
{
BaseA *bA;
bA = BaseA::CreateObject();

delete bA;
return 0;
}
[解决办法]
BaseA类自己写一个缺省的构造函数看看
[解决办法]

引用:
BaseA类自己写一个缺省的构造函数看看

不是编译器会默认构造函数么
[解决办法]

这里引用BaseB的时候,B的定义编译器还没看到,所以定位BaseB的构造函数
这样的情况应该把实现跟声明分开,放在两个文件里面
#include<iostream>
using namespace std;
// 类和他们的函数声明放在头文件里面
// 函数实现放在CPP文件里面
class BaseB;
class BaseA
{
public:
static BaseA* CreateObject();
virtual void DeleteObject()=0;
};
/*
这个函数写在一个cpp文件里面
BaseA* BaseA::CreateObject()
{
return new BaseB();
}
*/

class BaseB : public BaseA
{
public:
BaseB(){n_numA = 0;}
~BaseB(){}
virtual void DeleteObject(){delete this;};
private:
int n_numA;
};

int main()
{
BaseA *bA;
bA = BaseA::CreateObject();

delete bA;
return 0;
}

------解决方案--------------------



class BaseB : public BaseA
{
public:
BaseB(){n_numA = 0;}
~BaseB(){}
virtual void DeleteObject(){delete this;};
private:
int n_numA;
};

把CreateObject放在BaseB定义的后面啊



BaseA* BaseA::CreateObject()
{
return new BaseB();
}
[解决办法]
你这里使用了前向声明
class BaseB;

在编译器编译new BaseB();时尚未编译BaseB,自然无法找到构造入口。

看你代码的想法,使用一个工厂模型是比较合适的,要不就别使用虚接口
比如:
// consoleTest.cpp : 定义控制台应用程序的入口点。
//

#include<iostream>
using namespace std;

class BaseA
{
public:
virtual void print()=0;
};


class BaseB : public BaseA
{
public:
BaseB(){n_numA = 0;}
~BaseB(){}
virtual void print(){cout<<"This is B!"<<endl;};
private:
int n_numA;
};

class BaseC
{
public:
static BaseA* CreateObject();
void deleteObject();
private:
static BaseA* m_pobj;
};

BaseA* BaseC::m_pobj = NULL;

BaseA* BaseC::CreateObject()
{
if (m_pobj == NULL)
{
m_pobj = new BaseB;
}
return m_pobj;
}

int main()
{
BaseA *bA;
bA = BaseC::CreateObject();

delete bA;
return 0;
}

读书人网 >C++

热点推荐