【问题标题】:Functional dependent attribute in c++ class/structc ++类/结构中的功能依赖属性
【发布时间】:2020-09-10 09:33:25
【问题描述】:

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

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。以加法为例,依赖函数可能更复杂。

【问题讨论】:

    标签: c++ class struct attributes functional-dependencies


    【解决方案1】:

    你可以这样做:

    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 响应中。

    【讨论】:

    • 别忘了访问器。
    • @AsteroidsWithWings 我认为它们很明显,cdhowie 已经在他的回复中提到了它们,但你是对的。
    【解决方案2】:

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

    最简单的方法是让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;
    };
    

    【讨论】:

    • OP 说成员不需要是可变的,所以不需要 setter - 但如果你有它们,它们不应该与 getter 具有相同的名称。
    • “但如果你有它们,它们不应该与 getter 具有相同的名称”——我不同意这一点。他们有一个明显不同的呼叫签名。我不知道有人会对这个界面感到困惑。
    • 其实这种做法是explicitly recommended的一些人。
    • 我想我们必须同意不同意。这不是对风格进行广泛讨论的正确场所。
    • 确实没问题:)
    猜你喜欢
    • 2017-04-22
    • 2012-07-17
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多