提问人:user3137385 提问时间:7/12/2023 更新时间:7/12/2023 访问量:47
c++:当我在构造函数中设置对象变量并且对象更改其值时,为什么看不到对象变量的变化
c++: why can't I see changes of an object variable, when I set it in the constructor and the object changes the value of it
问:
也许最好显示代码,然后最好了解我的问题是什么。
类:
Cls::Cls() {}
Cls::Cls(int &var) : m_var(var){
std::cout << "constructor: " << m_var << std::endl;
}
Cls::~Cls() {}
void Cls::setVar() const {
m_var = 5;
std::cout << "setVar: " << m_var << std::endl;
}
页眉:
class Cls {
public:
Cls();
Cls(int &var);
virtual ~Cls();
void setVar() const;
private:
mutable int m_var;
};
主要:
int main() {
int var = 1;
Cls *cls;
cls = new Cls(var);
cls->setVar();
std::cout << "var: " << var << std::endl;
}
因此,我使用自定义构造函数传递了。在它之后,我调用一个函数来更改变量的值。我预计,我会看到 .我错了。我怎样才能做到这一点?我不想将变量作为函数参数传递。var
Cls(int &var)
main
答:
0赞
CaptainHb
7/12/2023
#1
虽然将 in main 作为引用传递给构造函数,但在构造函数中,它会将参数的值复制到 data 成员。也许您必须将数据成员声明为:var
Cls
Cls
var
m_var
m_var
mutable int& m_var;
1赞
mugiseyebrows
7/12/2023
#2
private:
mutable int m_var;
这不是一个参考,这是一个int,你需要:
private:
int& m_var;
由于您的类具有作为成员的引用,因此必须初始化该成员,因此您不能有默认构造函数。
0赞
user3137385
7/12/2023
#3
好的,我找到了解决方案。它实际上很容易安静。
类:
Cls::Cls() {}
Cls::Cls(int &var) : m_var(&var){
std::cout << "constructor: " << *m_var << std::endl;
}
Cls::~Cls() {}
void Cls::setVar() const {
*m_var = 5;
std::cout << "setVar(): " << *m_var << std::endl;
}
页眉:
class Cls {
public:
Cls();
Cls(int &var);
virtual ~Cls();
void setVar() const;
private:
int *m_var;
};
主要:
int var = 1;
Cls *cls;
cls = new Cls(var);
cls->setVar();
std::cout << "main var 1: " << var << std::endl;
}
对于那些问为什么以及如何...这不是我的实际代码。这是一个非常简短的示例,显示了我在代码中遇到的问题。
评论
0赞
Some programmer dude
7/12/2023
也不要使用指针!在某种程度上,它实际上比引用更糟糕。这应该解决的实际和根本问题是什么?请删除这个问题,并发布一个新问题,直接询问实际和潜在的问题,而不是让它成为 XY 问题。然后,我们可以帮助您解决这个问题,提供更好、更合适的解决方案。
评论
var
Cls::m_var
m_var
var
main
m_var
Cls
new
m_var
int& m_var;