【问题标题】:c++ struct trouble, access var within structc++ struct麻烦,在struct中访问var
【发布时间】:2013-09-24 08:58:23
【问题描述】:

好的,所以下面我有一个 c++ 结构:

typedef struct tagRECTEx{
 int top;
 int bottom;
 int left;
 int right;
 int width=(this->right-this->left);
 int height;

} RectEx;

现在我想做的是,当我声明说 RextEx WindowSize;我分配 WindowSize.left=250 和 WindowSize.right=300,我希望它在 WindowSize.width 为我减去它的地方,所以当我去使用 cout

我不想这样做:

WindowSize.width=(WindowSize.right-WindowSize.left);

我想通过:

... int width=(this->right-this->left); ...

唯一可行的方法是如果我这样做:

typedef struct tagRECTEx{
 int top;
 int bottom;
 int left=250;
 int right=300;
 int width=(this->right-this->left);
 int height;

} RectEx;

但我不能让它这样做,因为它们总是会改变。

有人可以帮我解决这个问题吗,因为过去 5 个小时我一直在尝试在 google 上在线查找此内容。

谢谢

【问题讨论】:

  • 实现getter/setter方法
  • 不,不要“实现”getter/setter。实现一个调整大小的方法。
  • @jrok 仅当属性是私有的且无法规避时,resize 方法才会有所帮助。

标签: c++ struct initialization auto assign


【解决方案1】:

有几种方法可以确保width 始终与左右“同步”:

  • 使tagRECTEx 不可变,并在构造函数中设置width,或者
  • 为所有变量添加 setter 函数,并在每次更改 leftright 时更新 width,或者
  • width 变量替换为width() 成员函数,如下所示:

int width() {
    return right-left;
}

我更喜欢最后一种方法,因为它通常更经济,并且因为它大大降低了在维护期间引入错误的可能性。

【讨论】:

  • 你能解释一下 int width() 和我下面的答案之间的区别吗?不一样吗?!
  • @Zaibis 不,这两个答案非常不同。您的回答建议在分配leftrightwidth 仍然不正确的设计,直到您的矩形用户自己调用updateWidth()。如果他们忘记拨打电话,width 将无限期地保持不正确。另一方面,即时计算width 永远不会“不同步”,因为用户不负责调用更新方法,并且不能忘记这样做。
  • 是的,但在你的情况下,如果他想在内部使用宽度,因为结构提供了一个内部变量宽度。在你的情况下,这个在你的方法调用后会保持不正确。所以在你的情况下,用户无论如何都必须做tagRECTEx.width = tagRECTEx.width();不是吗?
  • 他明确地询问如何设置这个内部值,因为他给定的结构在我看来是这样的。我只是举了一个符合他要求的例子。
  • @Zaibis 我建议用width() 替换width,所以没有“内部”width 来“保持不正确”。有一个非常普遍和重要的设计原则——不存储可以计算的内容。 OP的结构违反了该原则;我的回答试图纠正它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-08
  • 2016-03-04
  • 1970-01-01
  • 1970-01-01
  • 2014-10-29
  • 1970-01-01
  • 2012-08-17
相关资源
最近更新 更多