首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使不可访问的类变量

如何使不可访问的类变量
EN

Stack Overflow用户
提问于 2015-09-25 19:51:30
回答 3查看 445关注 0票数 1

我想知道是否有可能使类变量在这个类中不可访问?更改此变量值的唯一方法是通过类setter。例如:

代码语言:javascript
运行
复制
class foo
{
private:
    int m_var;
    bool m_isBig;
    void setVar(int a_var)
    {
        // do something before setting value, like emitting signal
        m_var = a_var;
    }
    void method()
    {
        int copy = m_var; // ok
        m_var = 5; // error!
        setVar(101); // ok
        doSomething();
    }
    void doSomething()
    {
        if(m_var > 5)
        { m_isBig = true; }
        else
        { m_isBig = false; }
    }
};

我知道我只能用getter和getter编写另一个类,但是这样我就无法访问foo类中的其他方法/vars(封装!)。我认为这可能是一个常见的问题,可能有一些设计模式,但我找不到任何。

编辑:我编辑代码是为了清楚,我想在setter中做什么。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-09-25 20:07:50

我不知道这种情况的模式,但有一种可能是将成员封装在嵌套类中。我认为这也是更好的风格,因为新类型的创建表达了这样的意图,即这个成员不仅仅是一个整数,而是具有独特的行为。

代码语言:javascript
运行
复制
class foo {
    class MVar {
      public:
        MVar(foo* parent, int value = 0) : m_parent(parent), m_value(value) {}
        MVar& operator=(const MVar&) = delete; // disable assignment
        operator int() const { return m_var; }
        void set(int new_value) {
            // do something, possibly with m_parent
            // nested classes have access to the parent's private members
            m_value = new_value;
        }
      private:
        foo* m_parent;
        int m_value;
    } m_var;
    void method() {
        int copy = m_var; // ok
        m_var = 5;        // error
        MVar.set(101);    // ok
    }
};

这并不能很好地满足您的需要,因为m_var实际上没有int类型,但这是需要考虑的问题。

票数 0
EN

Stack Overflow用户

发布于 2015-09-25 19:56:54

您可以将整数包装到一个特殊的类中,并且只能定义setVar(),而不能定义接受int的赋值操作符。

代码语言:javascript
运行
复制
class M_type
{
    int m_var;
public:
    explicit M_type(int m) : m_var{m} {}
    operator int() const { return m_var; }
    void setVar(int a_var) { m_var = a_var; }
};

class foo 
{
    M_type m_var;
    bool m_isBig;
public:
    explicit foo(int m) : m_var{m} {};

    void method()
    {
        int copy = m_var; // OK, calls operator int()
        m_var = 5; // error, no operator=(int)
        m_var.setVar(101); // OK, calls setVar(int)
        doSomething();
    }

    void doSomething()
    {
        if(m_var > 5)
        { m_isBig = true; }
        else
        { m_isBig = false; }
    }    
};

确保为M_type提供一个接受intexplicit构造函数,并且只为充当"getter“的隐式转换operator int()。如果也将构造函数隐式化,编译器生成的赋值operator=(M_type const&)将能够将参数5转换为M_type

票数 0
EN

Stack Overflow用户

发布于 2015-09-25 20:00:04

你不能完全按照C++的要求去做。类中的所有变量对类中的所有方法都是可见的,无论它们是公共的还是私有的。

你想问自己的问题是:为什么一个类想隐藏自己的东西?类的接口是类的内部实现和它提供给外部世界的服务之间的边界。你要么在教室里要么在外面。

考虑到这一点,也许您的用例是这样的,编写额外的类是合适的吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32789651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档