C++ 在cpp中动态更改属性的值
我有一个结构:C++ 在cpp中动态更改属性的值,c++,c,C++,C,我有一个结构: struct Person{ int scoreone; int scoretwo; int scoretotal; } main(){ Person a; a.scoreone=3; a.scoretwo=5; //and later a.scoreone=10; } 我希望scoretotal在不使用任何函数的情况下更改scoreone和scoretwo时更新。 感谢这是不能在C++中完成的。C++的处理方法是将记分符转换成方法 现在,不是
struct Person{
int scoreone;
int scoretwo;
int scoretotal;
}
main(){
Person a;
a.scoreone=3;
a.scoretwo=5;
//and later
a.scoreone=10;
}
我希望scoretotal在不使用任何函数的情况下更改scoreone和scoretwo时更新。
感谢
这是不能在C++中完成的。C++的处理方法是将记分符转换成方法
现在,不是说person.scoretotal,而是说person.scoretotal,每次都会重新计算总分。无论您使用何种语言,基本问题在于结构的设计。此结构中只有两个独立的数据值。但是你正在储存三个。这是个错误 您需要存储的只是两个主要值,scoreone和scoretwo。这些是数据。另一个值是由关系定义的派生值,其总和等于scoreone+scoretwo之和 <>你应该删除数据成员SCORITOTA,如果你在C中编码,或者在C++中编码,则用一个函数替换它。在C语言中,代码可能如下所示:
struct Person{
int scoreone;
int scoretwo;
};
int scoretotal(const struct Person person)
{
return person.scoreone + person.scoretwo;
}
不能自动改变值,需要运行一些代码,C或C++代码总是在函数中。
其余的答案假定使用C++,并且根本不在C中工作。 但是,您可以保持这一事实,即它是一个函数,不让外部可见,我想这正是您关心的:
struct Person {
int scoreone;
int scoretwo;
class total {
int *a, *b;
public:
total(int *a, int *b) : a(a), b(b) {}
operator int() { return *a + *b; }
} scoretotal;
Person() : scoretotal(&scoreone, &scoretwo) {}
};
这确实有一个通常很小的副作用。它依赖于从Person::total到int的隐式转换来完成其工作。这可能会在两种情况下导致意外结果。一种是,如果您试图在期望从int隐式转换为其他类型的情况下使用某个_person.scoretotal。您已经在使用从Person::total到int的隐式转换,并且编译器将只隐式使用一个用户定义的转换,这将失败。另一方面,如果要使用auto x=some_person.scoretotal;,x将是Person::total而不是int,因为auto将在不发生隐式转换的情况下推断实际类型
只要你做一些比较明显的事情,比如:
Person some_person;
some_person.scoreone = 1;
some_person.scoretwo = 2;
int total = some_person.scoretotal;
std::cout << "Total score: " << some_person.scoretotal;
…您将获得scoretotal跟踪scoreone和scoretwo的总数,而无需明确说明必须调用函数来完成此操作。如果您像john在回答中那样声明struct Person,则调用scoretotal函数时不应出现错误。请记住包含括号,表示person.scoretotal无效,您必须编写person.scoretotal,因为您在person结构中调用函数,而不是请求成员。请提供更多代码?&你的问题是什么?请选择一种语言。这是C还是C++?我建议C++。至于你所用的语言不清楚,你的主要是不对的。对main使用正确的声明。如果您不喜欢函数,宏如何?我已经编辑了标题并添加了c++为什么我的编译器在打印时抱怨“struct Person”没有名为“scoretotal”的成员?
Person some_person;
some_person.scoreone = 1;
some_person.scoretwo = 2;
int total = some_person.scoretotal;
std::cout << "Total score: " << some_person.scoretotal;