我有一个结构:
struct Person{
int scoreone;
int scoretwo;
int scoretotal;
}
main(){
Person a;
a.scoreone=3;
a.scoretwo=5;
//and later
a.scoreone=10;
}
我希望在不使用任何功能的情况下对scoreone和scoretwo进行更新时更新scoretotal。 感谢
答案 0 :(得分:6)
在C ++中无法做到。处理此问题的C ++方法是将scoretotal转换为方法
struct Person{
int scoreone;
int scoretwo;
int scoretotal() { return scoreone + scoretwo; }
};
现在不是说person.scoretotal
而是说person.scoretotal()
,而是每次都会重新计算得分总数。
答案 1 :(得分:1)
无论您使用何种语言,根本问题在于struct
的设计。此结构中只有两个独立的数据值。但是你要储存三个。这是错误的。
您需要的只是存储两个主要值scoreone
和scoretwo
。这些是data
。另一个值是由总和等于总和scoreone + scoretwo
的关系定义的派生值。
因此,如果使用C编码,则应删除数据成员scoretotal
并将其替换为函数;如果使用C ++编码,则应将其替换为成员函数。在C中,代码可能如下所示:
struct Person{
int scoreone;
int scoretwo;
};
int scoretotal(const struct Person person)
{
return person.scoreone + person.scoretwo;
}
答案 2 :(得分:1)
无法完成 - 要自动更改值,您需要运行一些代码,并且(在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
的隐式转换以完成其工作。在某些情况下,这可能会导致意外结果。如果您希望在some_person.scoretotal
隐式转换为其他类型的情况下尝试使用int
,则可能会出现这种情况。您已经在使用从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
的总数,而不必明确调用函数来执行此操作。
答案 3 :(得分:0)
如果你按照约翰在答案中所做的方式声明struct Person,那么在调用scoretotal函数时不应该出错。请记住包含括号,说“person.scoretotal”不起作用,你必须写“person.scoretotal()”,因为你在Person-struct中调用一个函数,而不是要求成员。