c++ - 封装数据,使 setter 是私有(private)的,而 getter 是公共(public)的

标签 c++ private encapsulation public data-members

我想知道如何最好地在 C++ 中创建一个数据实体,其中“setter”是私有(private)的,“getter”是公共(public)的。即实体的创建者应该能够设置数据,但用户/消费者/客户端只能获取数据。

让我们考虑实体 EntityX:

class EntityX
{
  public:
    EntityX(int x, int y) : x(x), y(y)
    {}
    int GetX() const {return x;}
    int GetY() const {return y;}
  private:
    int x,y; // Effective C++ third edition, Item 22: Declare data members private
}

还有一个创建实体并将其返回给客户端的类方法:

const shared_ptr<EntityX> classz::GetEntityX()
{
  shared_ptr<EntityX> entity(new EntityX(1,2));

  return entity;
}

在我看来,这使得 setter 为私有(private),而 getter 为公共(public),但如果数据成员> 5-10,则此示例不切实际...如何创建一个实体类/结构,使 setter 为“私有(private)” ”并且“getter”是“public”,而不使构造函数接受所有数据成员变量。

提前致谢

最佳答案

将您的Creator设置为类EntityX friend 怎么样:

   class EntityX
    {
      friend class Creator;
      public:
        EntityX(int x, int y) : x(x), y(y)
        {}
        int GetX() const {return x;}
        int GetY() const {return y;}
      private:
        int x,y; // Effective C++ third edition, Item 22: Declare data members private
    };

更新:

或者您可以使用模板化的友元,请参阅下面的代码:

#include <iostream>
#include <memory>

template<class T>
class EntityX
  {
  friend T;
  public:
    EntityX(int x, int y) : x(x), y(y) {}
    int GetX() const {return x;}
    int GetY() const {return y;}
  private:
    int x,y; // Effective C++ third edition, Item 22: Declare data members private
  };

struct Creator
  {
    static const std::shared_ptr<EntityX<Creator>> create() 
      {  
      std::shared_ptr<EntityX<Creator>> entity = std::make_shared<EntityX<Creator>>(1,2);
      entity->x = 1;
      entity->y = 2;
      return entity;
      }
  };

int main()
{
  std::shared_ptr<EntityX<Creator>> const E = Creator::create();
  std::cout << E->GetX() << ", " << E->GetY() << std::endl;

  return 0 ; 
}

关于c++ - 封装数据,使 setter 是私有(private)的,而 getter 是公共(public)的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23416683/

相关文章:

objective-c - 如何使用 DictationServices.framework

c++ - 标准容器封装和基于范围的 for 循环

java - 欺骗Java中的private关键字

c++ - QBitArray移位

google-app-engine - GAE Go - 如何将私有(private)变量放入数据存储区?

java - 我的类需要是不可变的,但我需要一个复制构造函数,并且由于我的字段未初始化,构造函数给我一个错误

java - 为什么我的数组被覆盖了java

c++ - 在 C++ 中使用函数或类来完成简单任务?

c++ - 取消引用指针列表的迭代器

c++ - 在迭代器上检索最大值