我有这个结构:
struct Parameters {
int x;
double y;
.
.
.
float z;
}
和一个Matrix类。
此结构应通过从文件中读取进行初始化,并保持const到最后。
如何从程序中的所有类访问那些? 我设法完成了一个单例,但是感觉不对。
我也尝试使用static,但是失败了,因为我必须以某种方式初始化字段
我想要类似的东西
class Consts {
Parameters _params;
Matrix _k;
}
并能够像这样访问它:
class OtherClass {
public:
void foo() {
Matrix a = Consts::_k;
int b = Consts::_params.x;
}
}
答案 0 :(得分:1)
实际上,辛格尔顿在很多地方都感到奇怪,see here是开始阅读该书的要点。但是随后considerable arguments也被答复。简而言之,底线可能是brought here,即仅当您拥有应该管理的单个共享资源时, 。因此,如果所讨论的资源不必具有一个以上的实例表示形式,并且该实例要负责管理该资源,那么Singleton可能是解决之道。
现在,您的Parameters
和Consts
类似乎(不需要其他信息)看起来像需要管理。此外,仅使用Singleton以使您可以在系统中全局访问其界面不是一个好主意。那是因为您很快就会失去对系统依赖的位置的跟踪(取决于哪个部分),因此将来对其进行的任何更改都可能会导致难以预料的错误和缺陷。
是否有任何理由不仅仅制作Consts
的单个实例,然后将其传递给需要它的任何人,从而暴露依赖关系而不是隐藏依赖关系?
例如,foo()
可以这样定义:
void foo(const Consts& consts) {
Matrix a = consts._k;
int b = consts._params.x;
}
或者您的OtherClass
类可以在其CTor中接收它,并将其存储为其访问方法的成员:
class OtherClass {
private:
const Consts& mConsts;
public:
OtherClass(const Consts& consts)
: mConsts(consts)
{}
void foo() {
Matrix a = mConsts._k;
int b = mConsts._params.x;
}
}