在cpp中动态更改属性的值

时间:2013-11-22 11:15:28

标签: c++ c

我有一个结构:

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。 感谢

4 个答案:

答案 0 :(得分:6)

在C ++中无法做到。处理此问题的C ++方法是将scoretotal转换为方法

struct Person{
    int scoreone;
    int scoretwo;
    int scoretotal() { return scoreone + scoretwo; }
};

现在不是说person.scoretotal而是说person.scoretotal(),而是每次都会重新计算得分总数。

答案 1 :(得分:1)

无论您使用何种语言,根本问题在于struct的设计。此结构中只有两个独立的数据值。但是你要储存三个。这是错误的。

您需要的只是存储两个主要值scoreonescoretwo。这些是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::totalint的隐式转换以完成其工作。在某些情况下,这可能会导致意外结果。如果您希望在some_person.scoretotal隐式转换为其他类型的情况下尝试使用int,则可能会出现这种情况。您已经在使用从Person::totalint的隐式转换,并且编译器将仅隐式使用一个用户定义的转换,这将失败。另一方面,如果您使用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跟踪scoreonescoretwo的总数,而不必明确调用函数来执行此操作。

答案 3 :(得分:0)

如果你按照约翰在答案中所做的方式声明struct Person,那么在调用scoretotal函数时不应该出错。请记住包含括号,说“person.scoretotal”不起作用,你必须写“person.scoretotal()”,因为你在Person-struct中调用一个函数,而不是要求成员。