首页 > 解决方案 > 静态成员是否通过在 C++ 中为每个实例制作副本来实现?

问题描述

我正在编写 C++ 绘图仪以绘制模拟和数字信号。绘图仪可以绘制一个或多个轴在另一个之上。每把斧头都可以是模拟的或数字的。IE:

Analog axe 1 (with signals 1,2)
Analog axe 2 (with signals 1,3,6)
Digital axe 1  (with signals 1,2,3,8)
Analog axe 3 (with signals 3,8)
Digital axe 2 (with signals 3,4)

轴具有相同的 x 轴(时间)并对齐。

绘图仪可以读取某种数据输入,例如 CSV。

我想读取一次输入数据,将模拟数据存储在一个容器中,将数字数据存储在另一个容器中。请注意,不同的轴可以有共同的信号。因此,我想避免有一个带有重复信号的容器。我想要一个包含完整数据的容器,然后在所需的轴上绘制信号。

我正在实现以下类:(不完整的代码)

class data_analog{
};

class data_digital{
};

class analog{
  static data_analog DataAnalog;
  double linewith;
  color linecolor;
  style linestyle;
public:
  trace_curve(); 
};

class digital{
  static data_digital DataDigital;
  color linecolor;
public:
  trace_digital();    
};

class axe{
  position p;
public:
  virtual void trace_all()=0;    
};

class axeAnalog: public axe{
  vector<analog> analogs;
public:
  void trace_all();    
};

class axeDigital: public axe{
  vector<digital>  digitals;
public:
  void trace_all();
};

class plot{
private:
  vector<axe> axes;
public:
  void print_axes();
};

我正在考虑在模拟和数字类中使用静态成员,以便这些类的所有实例都知道数据。
我对 OOP 和 C++ 几乎没有经验。我不知道这是否是解决我问题的最佳方法。此外,我不确定静态成员是在内存中复制还是所有对象都指向同一个内存地址。如果它为每个实例制作一个副本,这不是最好的解决方案,因为复制大数据不是一个好主意。

您对此实施有什么建议吗?

标签: c++oop

解决方案


没有静态成员不是副本。
您可以通过以下事实来判断,如果您从一个实例更改,则更改对其他实例可见。一个示例是实例计数器(在 ctor 中递增,在 dtor 中递减)。

尽管如此,我还是建议不要在大多数情况下使用静态数据成员来实现您描述的目标。准确地说,仅当您确实希望所有实例共享相同时才使用静态成员。仔细考虑这是否适用于您的情况。

在大多数情况下,我希望设计允许不同的实例组从多个实例中共享相同的数据成员的优势。
为此,我建议将共享数据分离到一个专用类中,并且所有用户实例都使用对他们负责的共享数据实例的引用来构建。


推荐阅读