【问题标题】:Static class for data storing用于数据存储的静态类
【发布时间】:2012-10-28 18:55:05
【问题描述】:

我对 C++ 语言还很陌生。我将它与 Qt 一起使用来创建跨平台用户界面。 用户界面将使用相同的数据显示不同的图形和绘图。所以我想让我的数据存储在一个类(Data_Class)中,可以从所有其他类访问。 在数据类中,我使用的是私有静态变量和公共静态方法(get/set)。

我不清楚的是如何从其他类访问数据类。换句话说,我在Class_A(到Data_Class)中写入后如何获取Class_B(来自Data_Class)中的数据值。

【问题讨论】:

标签: c++ qt class static


【解决方案1】:

假设这是一个面向语法的问题:

class Data_Class {
public:
    static int a;
    static int GetA() const { return a; }
}

ClassA:

Data_Class::a;
Data_Class::GetA();

不要忘记添加Data_Class static members definitions,例如添加到dataclass.cpp

static int Data_Class::a = 0;

否则你会收到undefined reference linker error


您也可以考虑使用singleton pattern根据 cmets,单例是个坏主意,如果可能,您应该避免使用它)作为 Aubin suggested,它将负责添加新的静态成员定义:

class Data_Class {
private:
    Data_Class();  // Prevents multiple instances

    int a;
    int b;

public:
    // Will initialize instance if needed
    static Data_Class &GetInstance(){
       static Data_Class instance;
       return instance;
    }


    int GetA() const {return a;}
};

用法:

Data_Class::GetInstance().GetA()

或者根据维基使用更复杂但更灵活的Dependency injection

依赖注入是一种允许选择的软件设计模式 在运行时而不是编译时制作的组件。这个可以 例如,用作动态加载插件的简单方法或 在测试环境中选择模拟对象与真实对象 生产环境。这种软件设计模式注入了 依赖元素(对象或值等)到目的地 自动通过了解目的地的要求。

【讨论】:

  • @DeadMG 如果您对这样一个简单的任务有更好的想法,我很乐意将其添加到我的答案中(我提供了更多选项......他的工作是研究每个选项并决定哪个(不)使用)...
  • @DeadMG,您能否提供解释为什么单例对于小型项目来说是个坏主意的来源?
  • -2 - 如果你真的需要使用单例模式,那么至少不要这样做new/delete 垃圾。提示:你怎么知道你的应用程序正在关闭并需要调用DestroyInstance?提示:什么时候初始化静态函数局部变量?提示:如果所讨论的指针不能(或不应该)永远NULL,C++ 是否具有远优于指针的构造?提示:如果合适的话,C++ 是否有远优于动态分配的内存分配方法?
  • @Vyktor 是的,现在你得到了静态初始化命令惨败。不要让实例成为类的成员,而是函数局部变量。
  • 谢谢。我的问题是我没有在 dataclass.cpp 文件中进行任何初始化。这解决了我的问题: static int Data_Class::a = 0;
【解决方案2】:

鉴于这两个类声明:

class A {
   public:
      static int get_data();
};

class B {
   public:
      static void do_something();
};

您可以像这样从 B 访问 A 的方法:

void B::do_something()
{
     int the_data = A::get_data();
     // now do whatever you need to do with that data
};

【讨论】:

  • 你不应该在定义上有static,只有声明。 IIRC,类之外的定义不会用它编译。
猜你喜欢
  • 2016-03-31
  • 1970-01-01
  • 2012-08-22
  • 1970-01-01
  • 1970-01-01
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多