为某些函数创建一个类const的私有成员

时间:2014-07-08 11:38:09

标签: c++ class const

我有一个名为myClass的小组:

myClass
{
    int myFunction1();
    int myFunction2();

private:
int A;
int B;
};

myFunction1中,A不应该改变,但B可以改变。 在myFunction2中,B不应该改变,但A可以改变。

有没有办法为每个功能灵活const? ie const B表示function1,反之亦然。

2 个答案:

答案 0 :(得分:2)

这不容易实现。您可以声明一个方法const,它将生成所有变量const。您可以声明成员mutable,以便即使在const函数中也可以对其进行变更。但是,您不能仅将成员mutable声明为某些方法。

但问题是:你为什么要那样?只需不要在方法中更改A。由于该方法在同一个文件中,因此记住它应该不会太难。

如果您确实需要对AB进行单独封装,即使在类中,也要为它们使用自己的类并将方法移动到类中,例如:

class MyClass {
private:
   AContainer A;
   BContainer B;
public:
   void myFunction1(){ B.myFynction1(A.get()); }
   void myFunction2(){ A.myFunction2(B.get()); }

   class BContainer {
       int B;
   public:
       int get(){ return B;}
       myFunction1(int A); // May only change B, A is provided as parameter
   }

   class AContainer {
       int A;
   public:
       int get(){ return A;}
       myFunction2(int B); // May only change A, B is provided as parameter
   }

}

答案 1 :(得分:2)

如果您真的需要实现这种行为,您可以将int包装到与特定功能相关的类中,同时提供获取/设置访问权限(非常简单,缺少所有功能)必要的实用程序 - 只是为了说明这一点):

class TIntA{
public:
    TIntA(int _i) : m_data(_i) {}

    // this function will be able to modify the m_data member but other
    // functions will have to use the get()
    friend int myClass::myFunction1();

    int get() const {return m_data;}

private:
    int m_data;
};

我确定你可以用模板进一步概括这种方法(你能提供一个函数作为模板参数吗?如果是这样你可以使这个类完全通用)