C++ 类/结构中的函数依赖属性

Functional dependent attribute in c++ class/struct

本文关键字:函数依赖 属性 结构 C++      更新时间:2023-10-16

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

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

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

在我的用例中,a, b, c是恒定的,如果这很重要(所以可以使用const int(。

所有属性都会在类/结构方法中多次出现,因此目标是缓存值a+b。以加法为例,依赖函数可能更复杂。

如果ab是可变的,那么你就不能强制c保持同步;这三个都必须是常量,你才能强制执行这个不变性。

最简单的方法是将c变成一个函数:

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

如果您希望在需要时缓存而不是计算c的值,则需要隐藏ab在访问器后面,以便在更新时可以更新c

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
};

编辑:
为了保持ab的值更新,并获取这些变量的值,你必须使用get和set方法,就像在@cdhowie响应中一样。