如何在C++类定义之外重载构造函数

3
好的,我一直在做一个家庭作业项目,发现了一种方法让我完成作业并提交,但它仍然困扰着我。
我有一个基类,动态分配了一些其他类和一个派生类。

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

可能是重复的问题:这段C++模板代码出错的原因是什么? - Nawaz
看起来我遇到了一个完全不同的错误,它可以编译通过但无法链接。 - TicViking
没有可编译的代码,很难诊断这样的错误。您能否发布一个最小但完整的代码示例来重现错误? - Björn Pollex
今天下课后我会尝试解决这个问题。目前我更好奇的是是什么导致了这种错误。 - TicViking
3个回答

3

标题:

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

请注意,在Derived中,new_type是引用而不是局部变量,因此传递给Derived的变量必须处于正确的作用域!

1

在类外部,您需要对所有构造函数和函数使用Derived::

Derived::Derived(Type new_type, Type2 new_type2): Base(new_type)
{//^^^^^^^^^ note this  
  type2_ptr = new Type2(new_type2);
};

同时考虑尽可能多地使用初始化列表。这里有一个例子!

Derived::Derived(Type new_type, Type2 new_type2): Base(new_type), type2_ptr(new Type2(new_type2))
                                                                //^^^^ note this!
{

};

0
你没有展示完整的内容。根据你展示的代码,应该没有虚函数表,因为没有虚函数(而且不管继承关系如何,该类都不是多态的)。
假设存在虚函数,你几乎肯定应该在 Base 中添加虚析构函数。
除此之外,在 .cpp 文件中的定义应该是:
Derived::Derived(Type new_type, Type2 new_type2)
    : Base(new_type)
    , type2_ptr(new Type2(new_type2))
{
}

在你的定义前面加上 Derived:: ,并且你公开代码中没有任何可能引起问题的地方。你真的应该提供一个完整的代码示例,以便我们更好地理解问题的根源;否则,我们只能猜测。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接