0

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

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

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

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

我读过关于单例的文章,但我不知道应该如何实现它。

我已经阅读了有关静态数据成员的信息,但 AFAIK 似乎我仍然必须以某种方式连接到 objectManager 实例,所以它对我没有帮助。

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

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

对象管理器.h

#pragma once
#include "Object.h"

static int xxxtest;

class objectManager
{

对象管理器.cpp

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

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

cout << xxxtest << endl;
-> 0

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

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

4

2 回答 2

0

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

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

标题:

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

共产党:

int Class::staticVariable = 5;

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

int Value = Class::staticVariable;

我希望这有助于阐明一些观点。啊,是的,我使用来自http://de.wikibooks.org/wiki/C++-Programmierung:_Statische_Elemente_in_Klassen的代码(页面是德语)作为参考。

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

标题:

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

共产党:

std::vector<double> Precompiled;    //Initialized automatically.
于 2012-07-21T15:49:07.447 回答
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();
于 2012-07-21T16:18:26.033 回答