Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ setter/getter和分层数据结构_C++ - Fatal编程技术网

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开发的全面声明。你应该考虑一个会员是公共会员还是私人会员。有时,公共数据成员是正确的想法。考虑以下问题:

  • 我需要在这个成员上保持一个不变量吗
  • 此成员是否可以具有无效值
  • 我是否希望接口提供此成员的替代表示形式
  • 如果以上任何一个问题的答案是肯定的,那么您可能需要使用getter

    还考虑是否单独设置成员是有意义的。也许您应该使用构造函数设置成员,并且希望提供一些其他接口来修改这些成员

    在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++编码风格不太适合我正在开发的应用程序(微电子仿真)。大多数类也包括几个成员函数。