C++:如何确保类成员变量只能在某个方法中修改

Gam*_*ads 3 c++ c++11 c++14

我正在使用带有clang的C++ 14 MacOS Sierra.我想按设计强制执行规则.以下是规则.

我班上有一个成员变量说:

unsigned int m_important_num;
Run Code Online (Sandbox Code Playgroud)

我班有四种方法.

fun1();
fun2();
fun3();
fun4();
Run Code Online (Sandbox Code Playgroud)

目标:
我只fun2()希望能够改变它的值m_important_num.

问题:
如果除了fun2()更改变量之外的任何方法,是否可能使编译器出错?一种可能的方法是声明const以某种方式授权fun2()改变const变量?这是一个好的解决方案吗?或者他们是更好的解决方案?

次要问题:
尝试做这样的事情是错误的设计吗?

Jef*_*ica 10

将其封装起来.放入m_important_num自己的班级.在现有类中聚合它.有一个吸气剂.然后把它fun2()作为你内在类的成员函数.


Jar*_*d42 10

排序,附加层:

class S1 {
public:
    void fun2() { /*Modify m_important_num */ }
    unsigned int getImportantNum() const { return m_important_num;}
private:
    unsigned int m_important_num;
};
class S2 : private S1
{
public:
    void fun1();
    using S1::fun2; // or void fun2() {S1::fun2();}
    void fun3();
    void fun4();
};
Run Code Online (Sandbox Code Playgroud)

正如Yakk评论的那样,如果func2需要访问S2成员,CRTP可以解决这个问题:

template <typename Derived>
class S1 {
public:
    void fun2() { asDerived().foo3(); /*Modify m_important_num */ }
    unsigned int getImportantNum() const { return m_important_num;}
private:
    Derived& asDerived() { return stataic_cast<Derived&>(*this); }
private:
    unsigned int m_important_num;
};
class S2 : private S1<S2>
{
    // friend class S1<S2>; // If required.
public:
    void fun1();
    using S1::fun2; // or void fun2() {S1::fun2();}
    void fun3();
    void fun4();
};
Run Code Online (Sandbox Code Playgroud)