2011-03-17 84 views
2

好吧,所以我一直在做一个家庭作业项目,并找到一种方法让我完成作业并将其打开,但仍然困扰着我。如何在C++中的类定义之外重载一个构造函数

我有一个动态分配一些其他类和派生类的基类。


//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

可能的重复[这是什么原因的C++模板代码的错误?](http://stackoverflow.com/questions/5288696/whats-the-cause-of-the-error-with-this-c - 模板代码) – Nawaz 2011-03-17 06:14:45

+0

好像我正在看一个完全不同的错误,它编译得很好,但不会链接。 – TicViking 2011-03-17 06:25:03

+0

如果没有可编译的代码,很难诊断出这些错误。你可以发布一个*最小*但完整的代码样本,重现错误? – 2011-03-17 08:30:38

回答

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! 
{ 

}; 
+0

我仍然得到这两个解决方案的vtable错误... – TicViking 2011-03-17 06:18:40

2

头:

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局部变量,所以传递给导出变量必须在适当的范围内!

0

你没有显示任何东西。在还有你的代码中,有 应该没有虚函数表,因为没有虚函数(和 类不是多态的,无论继承的。

假设有虚函数,你应该差不多了。 肯定是一个虚析构函数添加到库

除此之外,在.cpp文件的定义应该是:

Derived::Derived(Type new_type, Type2 new_type2) 
    : Base(new_type) 
    , type2_ptr(new Type2(new_type2)) 
{ 
} 

添加派生::在你前面定义的,并且有 没有在你揭示哪些守则的代码ld会导致问题。你 真的应该提供一个完整的代码例子,它会造成问题;否则,我们可以猜测。