层次结构中 类 的编译器错误
Compiler Error for classes in hierarchy
我有以下代码
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
的单独 class,其工作是管理该资源。但是,这给我留下了一个问题——我无法构造 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)
在正文中会创建一个额外的临时匿名对象classtempBase
,但是这样直接实例化一个纯虚拟class是不允许的
构造派生对象的基础部分时需要使用
derived(vars) : base(vars) { constructor code here }
我有以下代码
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
的单独 class,其工作是管理该资源。但是,这给我留下了一个问题——我无法构造 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)
在正文中会创建一个额外的临时匿名对象classtempBase
,但是这样直接实例化一个纯虚拟class是不允许的
构造派生对象的基础部分时需要使用
derived(vars) : base(vars) { constructor code here }