首页 > 解决方案 > 只能在 operator=() 中修改的类成员的 C++ 模式

问题描述

我希望能够声明一个只能在构造函数或赋值运算符中修改的类成员。由于const分配问题,声明不起作用。

   
   class foo
   {
      const int x;
   public:
      foo(int inp) : x(inp) {}
      foo(const foo &src) : x(src.x) {}
      foo& operator=(foo&src)
      {
         x = src.x; //compiler error (not desired)
         return *this;
      }
      
      void bar()
      {
         x = 4;  //compiler error (desired)
      }
   };

有谁知道可以做到这一点的优雅设计模式?我发现const成员的用处极其有限。但是,如果有一种模式只允许修改一个成员,operator=而在其他任何修改它的地方给出错误,我可能会大量使用它。

标签: c++

解决方案


您可以标记xprivate,然后在派生自的类中实现所有其他方法foo

class foo
{
private:
    int x;
protected:
    int y;
public:
    foo(int inp) : x(inp) {}
    foo(const foo &src) : x(src.x) {}
    foo& operator=(foo&src)
    {
         x = src.x;
         return *this;
    }
};

class derived : public foo
{
public:
    void bar()
    {
        x = 4;  // compiler error (desired)
        y = 42; // ok
    }
};

推荐阅读