gpt4 book ai didi

c++ - 将对象作为参数传递时是否调用构造函数?

转载 作者:行者123 更新时间:2023-11-27 23:11:04 25 4
gpt4 key购买 nike

我正在尝试编译我必须使用 C++ 继承的旧代码。我已经修复了一段时间,但我因这个错误而放弃了:

class Operation{
public:
char *op;
//Operation();
Operation(char op[]){
(*this).op = op;
}
};

class Param : Operation{
public:
int value;

Param(char op[], int value) : Operation(op){

(*this).op=op;
(*this).value=value;
}

int getValue(){
return this->value;
}

};


class MyBase{
public:
int valuea;
int valueb;
Operation operation;

MyBase(int a, int b, Operation* op){
valuea=a;
valueb=b;
operation=*op;
}

Operation* getSum(){};

Operation* getRest(){};
};

class MyExtend : public MyBase{
public:

Param* getSum(){
Param pam=new Param(this->valuea+this->valueb,"add");
return pam;
}

Param* getRest(){
Param pam=new Param(this->valuea-this->valueb,"rest");
return pam;
}
};

class Exec{

public int static main(args[] params){
MyExtend ext=new MyExtend(6,4);
cout << ext.getSum().getValue() << endl;
cout << ext.getRest().getValue() << endl;
return 0;
}

};

我关注的是

处的错误

MyBase(int a, int b, Operation* op){

即:

错误:没有匹配函数来调用“Operation::Operation()”

我很惊讶,因为它看起来像是在检查 Operation 的默认构造函数。如果我重载它的默认构造函数,但我不明白为什么。我是按值还是按引用传递 Operation 并不重要。你能给我一些关于这个功能的提示吗?我找不到一致的回应。请忽略以下错误,因为我正在处理这些错误。

祝一切顺利

最佳答案

MyBase 包含一个名为 operation 的成员,它属于 Operation 类型,既不是指针也不是引用,因此必须构造该成员由编译器在构造 MyBase 时执行。该成员未在 MyBase 构造函数的(不存在的)初始化列表中进行初始化,因此编译器将尝试默认构造它;但是,Operation 没有默认构造函数,因此会出现错误。

一个可能的解决方法是重写 MyBase 的构造函数以使用初始化列表,如下所示:

class MyBase
{
public:
int valuea;
int valueb;
Operation operation;

MyBase(int a, int b, Operation* op)
: valuea(a)
, valueb(b)
, operation(*op) { }
};

但请注意,就目前而言,这将依赖于默认(即编译器提供的)复制构造函数,它可能不会执行您想要的操作,因此您应该提供一个显式的复制者。

关于c++ - 将对象作为参数传递时是否调用构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20363928/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com