首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

急继承的有关问题

2013-09-06 
急求一个继承的问题下面的代码12行一直报错“BaseB : no appropriate default constructor available”,请

急求一个继承的问题
下面的代码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;
}

热点排行