C++ setter/getter和分层数据结构
我知道在你们班上设置公共字段被认为是个坏主意。但是,当您的类包含大量分层数据结构和字段时,最好的方法是什么?例如:C++ setter/getter和分层数据结构,c++,C++,我知道在你们班上设置公共字段被认为是个坏主意。但是,当您的类包含大量分层数据结构和字段时,最好的方法是什么?例如: class A {B d1; C d2; D d3;} class B {E d4; F d5;} class E {G d6; int d7;} 在C语言中,访问这样的数据结构非常容易,例如ptr_to_a->d1.d4.d7等等。。。但是当我们使用setter/getter时,方法是什么 < P>在C++中使用SETUTER和GETTER时,表达式如A.GETHYD1()、G
class A {B d1; C d2; D d3;}
class B {E d4; F d5;}
class E {G d6; int d7;}
在C语言中,访问这样的数据结构非常容易,例如ptr_to_a->d1.d4.d7等等。。。但是当我们使用setter/getter时,方法是什么
< P>在C++中使用SETUTER和GETTER时,表达式如A.GETHYD1()、GETYD4()、GETYD7()看起来不方便,而且它们强制返回引用。由于某些结构相当大,按值返回似乎是一个糟糕的想法
在这些情况下,您使用哪种方法或编码风格?也许要去掉setter/getter并将这些字段公开 如果您只是将类用作纯数据结构,并且没有与要封装的数据相关的行为,则使用
struct
,直接访问字段。这相当于使用一个类
,并将所有成员声明为public
,但将其称为struct
更清楚地表明,它只不过是简单的数据收集
如果您所做的不仅仅是存储数据,那么请使用getter和setter
在C++中使用SETUT和GETTER,表达式类似 答:get_d1()。get_d4()。get_d7()似乎不方便,而且它们会强制 返回引用。因为有些结构相当大,所以 从价值上看,这似乎是个糟糕的主意
不,您可以选择是通过引用还是通过值返回。在我的编码风格中,类不应该公开公共“原始”数据成员,而应该只公开getter和setter(即使它们是简单的单行方法) 这是因为代码可以在将来升级,单行方法可以扩展到更复杂的地方(或者可以添加一些只进行调试的构建功能来检查一些不变量等),因此最好保持客户端的接口一致(如果公开“原始”数据成员,这是不可能的) 您可以避免使用<代码> GETA()<代码>前缀,只需将数据成员视为具有“简单”(没有<代码> GETY.<代码> >的名称的“属性”,例如
class Shape
{
public:
....
COLORREF Color() const // Just Color() i.e. the property name, without get_...
{
return m_color;
}
private:
COLORREF m_color;
};
并编写客户端代码,如:
Shape s;
COLORREF someColor = s.Color();
Shape s;
s.Color(...).Draw(); // set color and draw shape
我觉得很好
对于setter,可以使用如下语法:
Shape& Color(COLORREF color)
{
m_color = color;
return *this;
}
并编写客户端代码,如:
Shape s;
COLORREF someColor = s.Color();
Shape s;
s.Color(...).Draw(); // set color and draw shape
如果属性的类型比COLORREF
(32位DWORD
)更复杂,则可以使用如下模式:
std::wstring Name() const // getter
{
return m_name;
}
Shape& Name(std::wstring name) // setter
{
// Pass by value and move from the value (C++11 move semantics)
m_name = std::move(name);
return *this;
}
我知道在你们班上设置公共字段被认为是个坏主意
这是一个来自过去十年Java开发的全面声明。你应该考虑一个会员是公共会员还是私人会员。有时,公共数据成员是正确的想法。考虑以下问题:
还考虑是否单独设置成员是有意义的。也许您应该使用构造函数设置成员,并且希望提供一些其他接口来修改这些成员
在C++中使用SETUTER和GETTER时,像A.GETYD1()、GETYD4()、GETYD7()这样的表达式似乎不方便< /P> 虽然对数据结构进行相当深的嵌套并不少见,但通常一段特定的代码不需要深入研究。如果是这样的话,我想它可能做的比它应该做的更多,超出了它的单一责任。但是,如果从
a
对象获取d7
是一项常见任务,那么a
可能应该在其接口中公开它:
int A::get_d7 {
return get_d1().get_d4().get_d7();
}
由于某些结构相当大,按值返回似乎是一个糟糕的想法
实际上,用现代C++,这根本不是问题。按值传递应视为对象传递的默认模式。这是因为现在可以从中移动临时对象,这本质上是一种非常有效的复制形式。但当按值返回时,可以确保创建了数据结构的副本。如果其中一个嵌套数据结构很大,考虑到我只想读取一个字段,这不是一个好主意。@jbgs这取决于它返回的内容。如果它返回一个成员对象,是的,它必须复制它。是的,这些嵌套的数据结构是成员对象。实际上,我认为普通的C++编码风格不太适合我正在开发的应用程序(微电子仿真)。大多数类也包括几个成员函数。