我想知道如何最好地在 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/