急求一个继承的问题
下面的代码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类自己写一个缺省的构造函数看看
[解决办法]
不是编译器会默认构造函数么
[解决办法]
这里引用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;
}