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 */
;
但是如果我想改变按钮的背景颜色呢?在这种情况下,我需要编写另外两个方法 => setColor
和 getColor
。事实上,我必须编写为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
。但是,如果还有其他具有相似属性的对象类型(ScrollBar
、ListBox
),这些 mixin 提供了一种减少样板代码和共享代码的方法(随着时间的推移使维护更容易)。
【参考方案2】:
但是如果我想改变按钮的背景颜色呢?在这种情况下,我需要 编写另外两个方法 => setColor 和 getColor。事实上,我必须编写为 Color 类定义的所有方法。
你为什么要这样做?
只需定义一个函数SetBackgroundColor(Color &newColor)
用于设置颜色,const Color& GetBackgroundColor() const
用于访问它!
【讨论】:
在Button
-类中。 (函数和方法有区别吗?)
我认为方法是类中使用的函数。 class::method(),但是 function()【参考方案3】:
但是如果我想改变按钮的背景颜色呢?在这种情况下,我需要编写另外两个方法 =>
setColor
和getColor
。事实上,我必须编写为Color
类定义的所有方法。
不正确。你只需要编写这两个方法。其他任何事情都会通过getColor
返回值发生。例如,要测试两个按钮是否具有相同的颜色,您可以编写:
if (button1.getColor() == button2.getColor())
不是
if (button1.hasSameColor(button2))
也就是说,除非您想隐藏 Button
对 Color
类的使用作为“实现细节”。我不建议这样做。处理颜色的程序通常应将颜色视为一种值类型,类似于纯数字、点、向量等。
【讨论】:
这会导致很长的“访问”链。例如,您必须使用button.getFont().setFont(button2.getFont())
,而不是使用button.setFont(button2.setFont())
。我知道,不好的例子。
对于您的第一行,您的意思是button.setFont(button2.getFont())
?
您的代码将起作用。但正如我所说,它会导致源代码很长。在使用它之前,您总是必须调用 .getColor。仅此而已。
您评论中的第二行代码没有意义。为什么Font
会有setFont()
方法?以上是关于CPP:作为另一个类中的私有成员类的主要内容,如果未能解决你的问题,请参考以下文章
如何在 .h 和 .cpp 中为类中的私有 char 数组编写 get 函数?
继承的基本概念: Java不支持多继承,也就是说子类至多只能有一个父类。 子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 子类中定义的成员变量和父类中