好吧,所以我一直在做一个家庭作业项目,找到了一种让我完成作业并让它上交的方法,但它仍然困扰着我。
我有一个动态分配其他类的基类,以及一个Derived类。
//header
class Base
{
Private:
Type *type_ptr;
Public:
Base();
Base(Type &new_type);
//getters and setters
}
class Derived : public Base
{
Private:
Type2 *type2_ptr;
Public:
Derived();
Derived(Type, Type2) : Base(Type);
}
我想知道的是我的.cpp文件应该是什么样子,而不是像这样在线进行,
Derived(Type new_type, Type2 new_type2): Base(new_type){
type2_ptr = new Type2(new_type2);
};
编辑:如果我在我的.cpp中尝试类似上面的内容,我会得到这样的错误,总是其中两个......
undefined reference to `vtable for Derived'
undefined reference to `vtable for Derived'
答案 0 :(得分:2)
头:
/* Base same as yours */
class Derived : public Base
{
Private:
Type2 *type2_ptr;
Public:
Derived();
Derived(Type&, Type2);
}
CPP:
Base::Base(): type_ptr(NULL)
{
// implementation goes here
}
Base::Base(Type &new_type): type_ptr(&new_type)
{
// implementation goes here
}
Derived::Derived()
{
// implementation goes here
}
Derived::Derived(Type& new_type, Type2 new_type2): Base(new_type),
type2_ptr(new Type2(new_type2))
{
// implementation goes here
}
注意new_type
是引用,而不是Derived
中的局部变量,因此传递给Derived的变量必须在适当的范围内!
答案 1 :(得分:1)
在课外,您需要对所有构造函数和函数使用Derived::
!
Derived::Derived(Type new_type, Type2 new_type2): Base(new_type)
{//^^^^^^^^^ note this
type2_ptr = new Type2(new_type2);
};
同时考虑尽可能多地使用initialization-list
。这是一个例子!
Derived::Derived(Type new_type, Type2 new_type2): Base(new_type), type2_ptr(new Type2(new_type2))
//^^^^ note this!
{
};
答案 2 :(得分:0)
你没有展示一切。在你展示的代码中,那里 应该没有vtable,因为没有虚函数(和 无论继承如何,该类都不是多态的。
假设有虚拟功能,你应该差不多 当然要为Base添加一个虚拟析构函数。
除此之外,.cpp文件中的定义应为:
Derived::Derived(Type new_type, Type2 new_type2)
: Base(new_type)
, type2_ptr(new Type2(new_type2))
{
}
在你的定义前加上Derived ::就可以了 您公开的代码中没有任何内容会导致问题。您 真的应该提供一个完整的代码示例 导致问题;否则,我们可以猜测。