我有以下代码
class interfaceBase // abstract class
{
public:
virtual void vf1() = 0;
};
class tempBase : public interfaceBase // manages a resource
{
tempBase(int a) { var = new int[a]; }
~tempBase(){ free(var); }
private:
int* var;
};
class derived : public tempBase // class I intend to instantiate.
{
public:
derived(int rhs){ tempBase(var); } // ERROR - Pasted below
void vf1() override final {}
};
int main()
{
int a = 5;
derived d(a);
}
我有一个需要管理的资源,我创建了一个名为tempBase
的单独类,其作用是管理该资源。但是,这给我留下了一个问题 - 我无法构造derived
类型的对象,因为似乎没有办法将构造函数调用到tempBase
我收到错误说
error C2512: 'tempBase' : no appropriate default constructor available
error C2259: 'tempBase' : cannot instantiate abstract class
如何更改我的代码,以便我可能仍然由tempBase
处理所有资源管理,并且derived
也可以实例化。
答案 0 :(得分:1)
你可以把它放在初始化列表中:
derived(int rhs) : tempBase(var) { } // No erroranymore - see below
有关原始代码中错误的一些其他说明:
tempBase
的初始值设定项,编译器尝试生成默认构造函数,以便在执行构造函数体之前构造所有成员变量。 tempBase(var)
会创建另一个类tempBase
的临时匿名对象,但不允许直接实例化纯虚拟类答案 1 :(得分:1)
构造派生对象的基础部分时,需要使用
derived(vars) : base(vars) { constructor code here }