flag = f-6ren">
gpt4 book ai didi

C++ 一个参数 bool 构造函数和 "new"关键字 : Logic Error

转载 作者:太空狗 更新时间:2023-10-29 20:15:17 25 4
gpt4 key购买 nike

我在 C++ 中有以下类

class MyClass {

public:
bool flag;

MyClass (bool flag = false) {
this->flag = flag;
}
...
};

在我的主要(用于测试)我有这样的东西

int main() {
MyClass number1 = MyClass(true);
MyClass number2 = MyClass(false);
MyClass number3 = new MyClass(false);
MyClass number4 = new MyClass(true);
MyClass number5 = new MyClass();
std::cout << number1.flag << number2.flag << std::endl;
std::cout << number3.flag << number4. flag << number5.flag << std::endl;
}

还有我的输出(假设 bool 值输出 true 或 false,并且输出的格式更好)

true, false 
true, true, true

问题是当我使用“new”关键字创建“MyClass”对象时,无论我在参数构造函数中做什么或不做什么,它总是将标志变量设置为 true。

它适用于不使用“new”的构造函数,但不适用于使用它的构造函数。我知道使用和不使用关键字 new 之间唯一真正的区别是,如果你不使用它,变量是在堆栈上创建的,否则它是在堆上创建的。我不认为这会继续出错。

如果我想让它正常工作,需要改变什么?我在类中确实有其他方法可以成功修改标志变量,但是初始化它不起作用。我也尝试使用成员初始化列表来构造变量,但这也不起作用。

感谢您的帮助!

编辑:这是编译的代码。我有两个文件,Test.c++ 和 AbstractCell.h。 AbstractCell 是 MyClass,当这段代码运行时它输出“isAlive: 1”

 void test_abstract_2(){
AbstractCell one = new AbstractCell();

std::cout << std::endl << "isAlive: " << one.alive << std::endl;

}

最佳答案

new返回的指针隐式转换为 bool ,然后传递给 MyClass(bool) .

换句话说,就是:

MyClass number3 = new MyClass(false);

相当于:

MyClass number3(bool(new MyClass(false)));

由于new返回的指针永远不会为空,转换总是产生 true ,这是传递给 number3 的内容的构造函数。新分配的指针被泄露。

你可能想说:

 MyClass* number3 = new MyClass(false);
MyClass* number4 = new MyClass(true);
MyClass* number5 = new MyClass();

(注意星号。)

如果声明构造函数 explicit 就不会遇到这个问题:

  explicit MyClass (bool flag = false) {
this->flag = flag;
}

代码将无法编译,这会立即告诉您出了点问题。

关于C++ 一个参数 bool 构造函数和 "new"关键字 : Logic Error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13593173/

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