封装数据,使setter是私有的,getter是公共的 我想知道如何最好地在C++中创建一个数据实体,其中“SETter”是私有的,“GETter”是公共的。i、 e实体的创建者应该能够设置数据,但用户/消费者/客户机只能获取数据 让我们考虑实体EntIXX: 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 }
以及创建实体并将其返回给客户端的类方法:封装数据,使setter是私有的,getter是公共的 我想知道如何最好地在C++中创建一个数据实体,其中“SETter”是私有的,“GETter”是公共的。i、 e实体的创建者应该能够设置数据,但用户/消费者/客户机只能获取数据 让我们考虑实体EntIXX: 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 },c++,private,encapsulation,public,data-members,C++,Private,Encapsulation,Public,Data Members,以及创建实体并将其返回给客户端的类方法: const shared_ptr<EntityX> classz::GetEntityX() { shared_ptr<EntityX> entity(new EntityX(1,2)); return entity; } const shared_ptr classz::GetEntityX() { 共享ptr实体(新实体x(1,2)); 返回实体; } 在我看来,这使得setter是私有的,getter是公共的,
const shared_ptr<EntityX> classz::GetEntityX()
{
shared_ptr<EntityX> entity(new EntityX(1,2));
return entity;
}
const shared_ptr classz::GetEntityX()
{
共享ptr实体(新实体x(1,2));
返回实体;
}
在我看来,这使得setter是私有的,getter是公共的,但是如果数据成员大于5-10,那么这个例子就不实用了。。。如何创建一个实体类/结构,使setter为“private”,getter为“public”,而不使构造函数接受所有数据成员变量
提前感谢将您的创建者设置为朋友
到类EntityX
:
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
};
更新: 或者您可以使用模板化的friend ship,请参见下面的代码:
#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 ;
}
#包括
#包括
模板
类实体
{
朋友T;
公众:
EntityX(intx,inty):x(x),y(y){
int GetX()常量{return x;}
int GetY()常量{return y;}
私人:
int x,y;/c++ C++第三版,项目22:声明数据成员私有
};
结构创建者
{
静态常量std::shared_ptr create()
{
std::shared_ptr entity=std::make_shared(1,2);
实体->x=1;
实体->y=2;
返回实体;
}
};
int main()
{
std::shared_ptr const E=Creator::create();
std::cout GetX()您的getter可以返回常量&so
public:
int const& Getter();
private:
int const& Setter(int value);
用变量名替换“setter”和“getter”
public:
int const& X();
private:
int const& X(int value);
你也可以用这个语法写同样的东西
const int& X();
只是你想怎么写的问题
祝你好运,我希望我能帮上忙。像这样的事情怎么样:
struct EntityValues
{
Type1 value1_;
Type2 value2_;
(etc for all the members of Entity
};
class Entity
{
public:
Entity () : <set default values>
{
}
// this avoids the sea-of-parameters problem by bundling the data values
// into a single parameter. Data can be added to values by name in random order
// before it is finally used here.
Entity(const EntityValues & values) : <set members by pulling data from values>
{
}
// individual public getters.
Type1 getValue1()const { return value1_;}
<repeat as necessary for other members>
// get everything at once
// (an alternative to individual getters)
//
void exportValues(EntityValues & values) const
{
<copy member to values>
}
// optional (this violates the "no public setters" constraint
// but it does it in a controlled manner.
void update(const EntityValues & values)
{
<set members by pulling data from values>
}
private:
<setters (if necessary) and members go here
};
struct EntityValues
{
类型1值1;
类型2值2;
(等)实体的所有成员
};
类实体
{
公众:
实体():
{
}
//这通过捆绑数据值避免了参数海洋问题
//数据可以按名称以随机顺序添加到值中
//在这里最后使用之前。
实体(常量实体值和值):
{
}
//个人公众获得者。
Type1 getValue1()常量{return value1_;}
//立即得到一切
//(单个getter的替代方案)
//
void exportValues(EntityValues和values)常量
{
}
//可选(这违反了“无公共设置器”约束
//但它是以可控的方式进行的。
无效更新(常量实体值和值)
{
}
私人:
我想,对于您不希望其他人更改的成员变量,只提供一个getter成员函数而不提供setter成员函数。我不希望实体类包含数据以外的任何内容。类的创建者必须提供所有数据o?为什么需要setter?您拥有的默认构造函数应该可以满足您的需要s、 不需要任何二传,私人或其他。康斯特内斯或朋友(船)因为我不知道所有的创建者…可能有数百个。例如,资源类进行数据库查询并返回一个EntityX类型的数据行。实体类EntityX无法查询数据,它只能包含数据,如果这有意义的话…@user3594184我现在不确定,但可能是Contin中的一个模板朋友类如果Setter是私有的,实体类的创建者就不能访问私有函数谢谢,我想我错过了问题的这一部分。我会重新考虑我的答案