如何存储所有成员都可以访问的数据

How to store data what needs to be accessible by all members?

本文关键字:都可以 成员 访问 数据 何存储 存储      更新时间:2023-10-16

我有以下问题(只是学习OOP风格的C++):我有3个类:

  1. 应用程序
  2. 对象管理器
  3. 对象

应用程序类设置启动变量并创建objectManager的实例。它告诉objectManager从不同的文件加载值,并预先计算向量中的一些数据,每个对象都需要这些数据。

我的问题如下:我想使用一个可用于每个对象的预先计算的向量。我不明白我怎么可能从对象访问这个变量,因为他们对管理器的实例一无所知。

我读过singletons,但我不知道该如何实现它。

我读过关于静态数据成员的文章,但AFAIK似乎我仍然需要以某种方式连接到objectManager实例,所以这对我没有帮助。

我尝试过全局变量(我知道…),但最终出现编译错误。

我试图将静态变量放在objectManager.h中的类定义之外(这是全局情况吗?),结果我发现了一些奇怪的事情:我可以从程序的所有部分访问变量,包括objectManager.h,但它的值在不同的类中是不同的/未初始化的。

objectManager.h

#pragma once
#include "Object.h"
static int xxxtest;
class objectManager
{

objectManager.cpp

xxxtest = 123456;
cout << xxxtest << endl;
-> 123456

在对象.cpp或应用.cpp(在之后)中时

cout << xxxtest << endl;
-> 0

你能向我解释一下这里发生了什么吗?

你能向我推荐一种简单干净的方法来组织这样一个程序,同时使预先计算的变量可以访问程序的其他部分吗?

静态类变量实际上就是解决方案。

类中的静态变量需要在CPP文件中声明,就在include之后。

标题:

class Class {
  static int staticVariable;
  static void staticFunction();
  //...
};

CPP:

int Class::staticVariable = 5;

这样做,所有Object实例都可以访问静态变量(如果它是私有的),整个程序的所有成员都可以通过声明:来访问它

int Value = Class::staticVariable;

我希望这能有所帮助。啊,是的,我用了http://de.wikibooks.org/wiki/C++-Programmierung:_Statische_Elemente_in_Klassen(页面为德语)作为参考。

回到你的问题,这意味着:

标题:

class objectManager {
    static std::vector<double> Precompiled;
};

CPP:

std::vector<double> Precompiled;    //Initialized automatically.

由于您只打算创建一个objectManager,因此它是singleton或常规全局的候选者。作为一个全局文件,您可以定义这样的头文件:

// in object_manager.hpp
class App;
class ObjectManager;
class ObjectManagerImpl;
ObjectManager & objectManager ();
class ObjectManager {
    friend ObjectManager & objectManager ();
    friend class App;
    std::unique_ptr<ObjectManagerImpl> impl_;
    ObjectManager ();
    void read_files (std::string file1, std::string file2);
public:
    std::vector<int> & precomputed ();
    //...
};

在你的源文件中,你可以有这样的东西:

// in object_manager.cpp
class ObjectManagerImpl {
    friend class ObjectManager;
    std::vector<int> precomputed_;
    //...
};
ObjectManager::ObjectManager () : impl_(new ObjectManagerImpl) {}
void ObjectManager::read_files (std::string file1, std::string file2) {
    //...
}
std::vector<int> & ObjectManager::precomputed () {
    return impl_->precomputed_;
}
//...
ObjectManager & objectManager () {
    static ObjectManager instance;
    return instance;
}

现在,在object的源文件中,将包含objectManager的头文件,并通过访问器访问vector

// in object.cpp
//...
    std::vector<int> &precomputed = objectManager().precomputed();