加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 06:46:19 所属栏目:百科 来源:网络整理
导读:我在MacOS Sierra上使用C 14和clang.我想按设计强制执行规则.以下是规则. 我班上有一个成员变量说: unsigned int m_important_num; 我班有四种方法. fun1();fun2();fun3();fun4(); 目的: 我只想让fun2()能够改变m_important_num的值. 题: 如果fun2()以外
我在MacOS Sierra上使用C 14和clang.我想按设计强制执行规则.以下是规则.

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

unsigned int m_important_num;

我班有四种方法.

fun1();
fun2();
fun3();
fun4();

目的:
我只想让fun2()能够改变m_important_num的值.

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

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

解决方法

排序,附加层:

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();
};

正如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();
};

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读