我需要在单线程应用程序中将Params类的实例公开为全局对象。
作为一种安全措施,我希望防止客户端代码无意中覆盖对象本身。但是,我不能使用const限定符(如下例所示),因为某些类方法是非const的。
这个类可以在代码的其他部分重新实例化,所以我想避免改变它的内部以适应这种特殊需要,例如:通过使用单例设计模式或将可变限定符应用于某些数据成员。
我能想到的唯一解决方案是一个简单的包装类,其单个数据成员是一个可变的Params对象,但对于这样一个简单的要求来说,这似乎是一个可怕的解决方案。
我不会对C ++的最新进展感兴趣,所以也许有人可以提出更优雅的解决方案。
// params.h
class Params
{
..
};
extern const Params params;
// params.cpp
#include "params.h"
const Params params; // no good because class has mutable methods
答案 0 :(得分:1)
如果你想要一个无法覆盖的可变对象,你可以使这个类operator=
私有/受保护。
答案 1 :(得分:1)
我建议将具有非成员函数的全局Param
对象包装在适当的命名空间中,然后使用对于实现而言私有的Param
对象来实现这些函数。
有些事情:
GlobalParam.h:
#pragma once
namespace GlobalParam
{
void setParam1(Args ...);
void setParam2(Args ...);
Type1 getParam1();
Type2 getParam2();
// etc.
}
GlobalParam.cc:
#include "GlobalParam.h"
namespace GlobalParam
{
// Provide a function that returns a reference
// to the global Param object. All functions make use of
// this object. This function is not exposed to the users of
// the API.
Param& getParam()
{
static Param param;
return param;
}
void setParam1(Args ... args) { getParam().setParam1(args...); }
void setParam2(Args ... args) { getParam().setParam2(args...); }
Type1 getParam1() { return getParam().getParam1(); }
Type2 getParam2() { return getParam().getParam2(); }
// etc.
}