在创建子类复制构造函数时,是否强制使用/创建默认超级构造函数?[C++] 我试图在C++中使用超类来创建子类,而不使用任何默认构造函数,我不需要它们。
以下是课程: Object.hpp Object.cpp 类hpp Class.cpp hpp子类 子类.cpp 每当我试图用标量实例和子类的指针实例编译代码时,都会出现如下错误: ..\sources\Subclass.cpp:在复制构造函数“Subclass::subassconst Subclass&”中: ..\sources\Subclass.cpp:17:41:错误:调用“Class::Class”时没有匹配的函数 如果我为类而不是对象创建了无用的默认构造函数,我会得到同样的错误: 没有用于调用“Object::Object”的匹配函数在创建子类复制构造函数时,是否强制使用/创建默认超级构造函数?[C++] 我试图在C++中使用超类来创建子类,而不使用任何默认构造函数,我不需要它们。,c++,C++,以下是课程: Object.hpp Object.cpp 类hpp Class.cpp hpp子类 子类.cpp 每当我试图用标量实例和子类的指针实例编译代码时,都会出现如下错误: ..\sources\Subclass.cpp:在复制构造函数“Subclass::subassconst Subclass&”中: ..\sources\Subclass.cpp:17:41:错误:调用“Class::Class”时没有匹配的函数 如果我为类而不是对象创建了无用的默认构造函数,我会得到同样的错误:
在我的例子中,我不希望这些是空的默认构造函数。有办法解决这个问题吗?您的复制构造函数应该是:
Class::Class(const Class& other) : Object(other)
{
x = other.x;
y = other.y;
z = other.z;
}
及
甚至,在你的情况下:
Class::Class(const Class& other) = default;
Subclass::Subclass(const Subclass& other) = default;
或者干脆在声明中省略它们
省略:初始值设定项列表中的Objectother等效于
Class::Class(const Class& other) : Object(/*Empty*/)
{
x = other.x;
y = other.y;
z = other.z;
}
由于没有对象的默认构造函数,因此无效。请阅读
基本上,由于复制构造函数执行默认的操作,而析构函数是无用的,所以零规则应该为您完成这项工作
只需丢弃复制构造函数和析构函数的显式声明和定义。将此作为答案发布,以获得更高的可见性 假设在运行时没有生成任何数据,也没有动态资源,那么利用编译器提供的复制构造函数和析构函数就可以了 复制/移动构造函数和析构函数的存在是为了解决您没有的问题。我推荐阅读@Marek R也链接过的文章 如果必须显式声明它们以满足某些任意要求,则可以将它们声明为默认值 例如:
// In Subclass.hpp
Subclass(const Subclass& other) = default;
为什么还要写呢?它们通过不添加任何特殊成员函数来获得正确的行为。@NathanOliver:的确如此。正如NathanOlivier所指出的,您可以=默认的复制构造函数和析构函数,或者干脆忽略它们。
#ifndef SUBCLASS_HPP_
#define SUBCLASS_HPP_
#include "Class.hpp"
class Subclass: public Class {
public:
//constructors.
Subclass(int u, int v, int w);
Subclass(const Subclass& other);
//destructor
~Subclass();
//getters
int getU();
int getV();
int getW();
//setters
void setU(int u);
void setV(int v);
void setW(int w);
private:
int u, v, w;
};
#endif /* SUBCLASS_HPP_ */
#include "../headers/Subclass.hpp"
//constructors.
Subclass::Subclass(int u, int v, int w) : Class(u, v, w){
this->u = u;
this->v = v;
this->w = w;
}
Subclass::Subclass(const Subclass& other){
u = other.u;
v = other.v;
w = other.w;
}
//destructor.
Subclass::~Subclass(){
u = 0;
v = 0;
w = 0;
//Class::~Class();
}
//getters
int Subclass::getU(){
return u;
}
int Subclass::getV(){
return v;
}
int Subclass::getW(){
return w;
}
//setters
void Subclass::setU(int u){
this->u = u;
}
void Subclass::setV(int v){
this->v = v;
}
void Subclass::setW(int w){
this->w = w;
}
Class::Class(const Class& other) : Object(other)
{
x = other.x;
y = other.y;
z = other.z;
}
Subclass::Subclass(const Subclass& other) : Class(other)
{
u = other.u;
v = other.v;
w = other.w;
}
Class::Class(const Class& other) = default;
Subclass::Subclass(const Subclass& other) = default;
Class::Class(const Class& other) : Object(/*Empty*/)
{
x = other.x;
y = other.y;
z = other.z;
}
// In Subclass.hpp
Subclass(const Subclass& other) = default;