C ++类/结构中的函数相关属性

我要创建一个类/结构,其中一个属性在功能上依赖于其他属性。如何做到这一点?

struct Numbers {
  int a;
  int b;
  int c; // c == a+b
}


Numbers n1 {1, 2, 3}; // Ok.
Numbers n2 {1, 2, 4}; // Error! 

In my use case, a, b, c are constant, if that matters (so const int may be used).

All attributes will appear many times in class/struct methods, so the goal is to cache the value a+b. Addition is used as an example, the dependency function may be more complex.

评论
ramet
ramet

If a and b are mutable then you can't enforce that c is kept in sync; all three would have to be const for you to enforce this invariant.

The simplest approach would be to make c a function:

struct Numbers {
  int a;
  int b;
  int c() const { return a + b; }
}

If you want the value of c to be cached instead of computed when needed then you need to hide a and b behind accessors as well so that you can update c when they are updated.

class Numbers {
public:
  Numbers(int a, int b) : ma{a}, mb{b} { updateC(); }

  int a() const { return ma; }
  int b() const { return mb; }
  int c() const { return mc; }

  void a(int v) { ma = v; updateC(); }
  void b(int v) { mb = v; updateC(); }
  // No setter for c

private:
  void updateC() { mc = ma + mb; }

  int ma;
  int mb;
  int mc;
};
点赞
评论
禽小兽
禽小兽

您可以执行以下操作:

struct Numbers {
    Numbers(int a, int b) : a(a), b(b), c(a + b) {}

private:
    int a;
    int b;
    int c; // c == a+b
};
点赞
评论