【问题标题】:C++ Design: How do I set up two classes that share a set of variables?C++ 设计:如何设置两个共享一组变量的类?
【发布时间】:2018-09-16 14:39:25
【问题描述】:

这可能是个愚蠢的问题,但是对共享一组变量的 2 个类进行编程的最佳方法是什么?

  1. A 类和 B 类都需要访问 int x 和 int y。
  2. 如果 A 类更改 x 或 y,则更改应反映在 B 类中

我的想法: A 类和 B 类可以继承 C 类(其中包含变量 x,y) - 但这会为 A、B 创建一个 c 的实例。 - 我只需要一个 x 和 y 的实例

也许我需要朋友类或静态变量?

【问题讨论】:

  • 看起来像XY问题,不清楚为什么需要他们分享。
  • 执行所有A 和所有B's need the same x` 和y 还是应该每组AB 都有自己的xy
  • 制作 xy 全局变量。
  • 或者可能使用静态类成员,如下面的答案...
  • 请注意,变量在运行时不存在(它们只存在于您的 C++ 源代码中)。只有编译器关心变量(在程序执行期间,您有 locations 并且变量已被遗忘)。所以严格来说,你的问题没有任何意义。

标签: c++ class-design class-hierarchy shared-data


【解决方案1】:

首先 - 这取决于。你还没有告诉我们整个故事。但你已经做出了一些假设,我想劝阻你不要做。

A 和 B 共享一些共同数据这一事实并不意味着它们本质上是相同的。一个人可能有一个旅行目的地,一个会议可能有一个地点,但这并不意味着他们必须是同一事物的子类。

因此很可能您应该使用以下内容:

struct C { int x; int y; };

class A { 
    C& foo;
    int bar;
    A(C& some_c) : foo(some_c) { }
    // ... etc. ...
};

class B { 
    C& baz;
    int qux;
    A(C& some_c) : baz(some_c) { }
    // ... etc. ...
};

没有继承,没有友元类,没有静态变量——这些都没有。继承可能是合适的;再次,这取决于。

注意:我给出的示例并未解决 A、B 和 C 变量的范围/寿命方面的潜在差异。如果存在这样的分歧,那么在堆上创建所有这些对象并让 A 和 B 将 std::shared_ptr 保存到 C 可能是有意义的。

【讨论】:

  • 这个例子会导致崩溃。如果(当)有人在使用AB 的实例之前释放了C 的实例,它将做一些无法形容的事情。人们仍然(出于某种原因)进行手动内存管理。使用 std::shared_ptr<C> 而不是 C& 会得到相同的结果,但更安全。
  • @Clearer,不是不会。不需要的时候不用shared_ptr。在这种情况下,根据使用情况,它可能需要或不需要,并且您提出的广泛建议是没有保证的。
  • @Clearer:确实,不会,但是您提出了一个有效的观点,即您必须注意范围/生命周期。见编辑。
  • 肯定会出问题。也许不会立即崩溃,但您肯定会遇到问题。您的注释证明了赞成。
  • @Clearer 我建议,你变得不那么迫切了。没有人“肯定”会遇到问题。在不需要时使用动态分配是一种严重的悲观情绪。我建议你少教多学。
【解决方案2】:

使用带有静态变量的基类:

#include <iostream>
struct C
{
    static int x;
    static int y;
};

struct A : C
{

};

struct B : C
{

};

int C::x = 0;
int C::y = 0;

int main()
{
    A a;
    a.x = 1;
    a.y = 2;
    B b;
    std::cout << b.x << b.y << '\n';
}

如果您发现自己需要这样做,请重新考虑您的设计。

【讨论】:

  • 无视@SergeyA 的“建议”。
  • 你的论点能不能少一点建设性?
  • @SergeyA 为什么是全局变量?静态类成员有什么问题?
  • 全局变量会污染整个命名空间,而静态成员变量至少只会污染类的命名空间。
  • 至少你可以使用命名空间,类不适合这个用途。
猜你喜欢
  • 2020-08-02
  • 2019-06-27
  • 1970-01-01
  • 2013-12-20
  • 2016-02-09
  • 1970-01-01
  • 2010-12-31
  • 1970-01-01
  • 2012-03-09
相关资源
最近更新 更多