如何存储所有成员都可以访问的数据
How to store data what needs to be accessible by all members?
我有以下问题(只是学习OOP风格的C++):我有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();
- C++映射有2个键,这样任何1个键都可以用来获取值
- 任何人都可以告诉我我的 C++ 代码出了什么问题?
- 任何人都可以弄清楚这段代码如何显示运行错误?它打印无限时间 -1 以及正确答案
- 任何人都可以解释一下我是否需要 & 在第一个代码片段中
- 任何人都可以查明我的递归函数中的错误吗?
- Qt C++创建一个所有类都可以访问的全局变量
- 任何方法都可以在C++中比较数据结构中的许多方法
- 交叉和计算,任何人都可以解释代码吗?
- 我的合并排序没有给出正确的排序数组,任何人都可以解释一下吗?
- 任何人都可以解释这个初始值设定项代码吗?
- 如何使用C++共享目录,以便每个人都可以访问
- 任何人都可以在带有JNI的Android Studio上帮助我解决此错误,是否缺少一些内容?
- 如何制作一个结构程序,在其中可以存储无限量的数据,以便每次您想要时都可以将另一个产品添加到列表中?
- 任何人都可以检查这个回文 c++ 代码是否正确
- 任何机构都可以在运算符重载中解释这行代码
- 任何人都可以为我解释这个C
- C :对输入验证函数进行编程的性能影响可以对其进行编程,而每次都可以将其编程
- 如何存储所有成员都可以访问的数据
- 类的所有成员函数都可以访问的堆栈
- C++无论如何都可以在不知道名称的情况下访问数据成员