如何存储所有成员需要访问的数据?

时间:2012-07-21 15:39:29

标签: c++ visual-studio-2010 oop

我有以下问题(只是学习OOP样式C ++):我有3个类:

  1. 应用
  2. 的ObjectManager
  3. 物体
  4. app类设置启动变量并创建objectManager的实例。它告诉objectManager加载来自不同文件的值,并预先计算每个对象所需的向量中的一些数据。

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

    我读过单身人士,但我不知道应该如何实施。

    我已经阅读了静态数据成员,但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
    

    在object.cpp或app.cpp(之后)

    cout << xxxtest << endl;
    -> 0
    

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

    您能否推荐一种简单而干净的方式来组织此类程序,同时使预先计算的变量可以访问该程序的其他部分?

2 个答案:

答案 0 :(得分:0)

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

类中的静态变量需要在包含后立即在CPP文件中声明。

部首:

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的代码(Page是德语)作为参考。

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

部首:

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

CPP:

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

答案 1 :(得分:0)

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

// 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();