CPP:作为另一个类中的私有成员类

Posted

技术标签:

【中文标题】CPP:作为另一个类中的私有成员类【英文标题】:CPP: Class as private member in another class 【发布时间】:2013-09-06 19:00:44 【问题描述】:

例如,我创建了一个 Button 类。 Button 应该有自己的文本(颜色、大小、字体、间距等)、状态和背景。

因为文本标签即使在其他小部件(文本标签、文本编辑等)中也很有用。我将所有需要的东西放在另一个类中(称之为Label)。

背景颜色也很有用,所以我创建了另一个类 - Color,其中包含所有需要的方法 - 更改、比较...

现在回到 Button 类。

class Button 
    private:
        Color _bgColor;
        Label _text;

        /* another private members */

    public:
        /* Content of Button class */
;

但是如果我想改变按钮的背景颜色呢?在这种情况下,我需要编写另外两个方法 => setColorgetColor。事实上,我必须编写为Color 类定义的所有方法。

另一种选择是将私有类定义为公共类并像button.bgColor.setColor() 一样访问它们。但对我来说,一次打电话button.disable 和另一次button.color.setColor 似乎很奇怪。

还有其他我不知道的选项吗?谢谢你的帮助。

【问题讨论】:

我认为你已经很好地总结了你的选择。 很高兴知道:) 那么,没有比使用类作为公共方法更好的解决方案了吗?使用friend 表示设计错误。 这完全取决于您对便利性和封装性的重视程度。 作为懒人,我可能更喜欢方便。另一方面,我应该从一开始就以“好的方式”做事 【参考方案1】:

你是对的,当某些东西具有属性时,这些属性需要以某种方式公开,这可能导致代码膨胀。但是,与所有事物一样,简单的抽象层可以使事情变得更容易。

您可以为这些类型的属性提供“帮助类”并将它们用作混合。这将保持代码尽可能小,同时仍然

class HasLabel

public:
   void SetLabelText(const std::string& text);
   const std::string& GetLabelText() const;

private:
   Label label_;
;

class HasBackgroundColor

public:
   void SetBackgroundColor(const Color& color);
   const Color& GetBackgroundColor() const;

private:
   Color color_;
;

class Button : private HasBackgroundColor, private HasLabel

public:
   // Expose BkColor
   using HasBackgroundColor::SetLabelText;
   using HasBackgroundColor::GetLabelText;

   // Expose Label
   using HasLabel::SetLabelText;
   using HasLabel::GetLabelText;
;

您也可以使用公共继承,然后就不需要 using 指令,但这是否可以接受(如果 Button 真正“是”HasLabel)是个人喜好问题。

您还可以使用 CRTP 来减少具有类似 mixin 的对象的样板代码量。

【讨论】:

这看起来不错。但是,我看不出这与 haansn08 的答案有什么区别。除此之外,此方法还需要另外两个类。 同意,如果唯一的对象类型是Button。但是,如果还有其他具有相似属性的对象类型(ScrollBarListBox),这些 mixin 提供了一种减少样板代码和共享代码的方法(随着时间的推移使维护更容易)。 【参考方案2】:

但是如果我想改变按钮的背景颜色呢?在这种情况下,我需要 编写另外两个方法 => setColor 和 getColor。事实上,我必须编写为 Color 类定义的所有方法。

你为什么要这样做? 只需定义一个函数SetBackgroundColor(Color &newColor) 用于设置颜色,const Color& GetBackgroundColor() const 用于访问它!

【讨论】:

Button-类中。 (函数和方法有区别吗?) 我认为方法是类中使用的函数。 class::method(),但是 function()【参考方案3】:

但是如果我想改变按钮的背景颜色呢?在这种情况下,我需要编写另外两个方法 => setColorgetColor。事实上,我必须编写为Color 类定义的所有方法。

不正确。你只需要编写这两个方法。其他任何事情都会通过getColor 返回值发生。例如,要测试两个按钮是否具有相同的颜色,您可以编写:

if (button1.getColor() == button2.getColor())

不是

if (button1.hasSameColor(button2))

也就是说,除非您想隐藏 ButtonColor 类的使用作为“实现细节”。我不建议这样做。处理颜色的程序通常应将颜色视为一种值类型,类似于纯数字、点、向量等。

【讨论】:

这会导致很长的“访问”链。例如,您必须使用button.getFont().setFont(button2.getFont()),而不是使用button.setFont(button2.setFont())。我知道,不好的例子。 对于您的第一行,您的意思是button.setFont(button2.getFont()) 您的代码将起作用。但正如我所说,它会导致源代码很长。在使用它之前,您总是必须调用 .getColor。仅此而已。 您评论中的第二行代码没有意义。为什么Font 会有setFont() 方法?

以上是关于CPP:作为另一个类中的私有成员类的主要内容,如果未能解决你的问题,请参考以下文章

如何在c#中访问另一个类中的一个类的私有函数?

将非静态成员函数作为参数传递给另一个类中的成员函数

如何在 .h 和 .cpp 中为类中的私有 char 数组编写 get 函数?

继承的基本概念: Java不支持多继承,也就是说子类至多只能有一个父类。 子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 子类中定义的成员变量和父类中

如何使用 gmock 模拟修改 C++ 类中的私有变量的成员函数?

如何对类中的私有成员变量进行赋值和访问