如何保护具有非const方法的全局对象

时间:2015-07-21 15:30:09

标签: c++

我需要在单线程应用程序中将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

2 个答案:

答案 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.
}