我有以下代码

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

最佳答案

您必须将其放在初始化器列表中:

derived(int rhs) : tempBase(var) { } // No erroranymore - see below


有关原始代码中的错误的一些其他说明:


由于没有tempBase的初始化程序,因此编译器尝试生成默认构造函数,以便在执行构造函数主体之前构造所有成员变量。
您在正文中的tempBase(var)将创建类tempBase的其他临时匿名对象,但是不允许直接实例化纯虚拟类

08-27 16:57