我有以下问题(只是学习OOP样式C ++):我有3个类:
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
你能解释一下这里发生了什么吗?
您能否推荐一种简单而干净的方式来组织此类程序,同时使预先计算的变量可以访问该程序的其他部分?
答案 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();