gpt4 book ai didi

c++ - CPP : Class as private member in another class

转载 作者:行者123 更新时间:2023-11-28 03:10:19 25 4
gpt4 key购买 nike

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

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

背景颜色也很有用,所以我创建了另一个类 - Color 以及所有需要的方法 - 改变,比较......

现在回到 Button 类。

class Button {
private:
Color _bgColor;
Label _text;

/* another private members */

public:
/* Content of Button class */
};

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

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

还有其他我不知道的选择吗?感谢您的帮助。

最佳答案

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

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

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;
};

您也可以使用公共(public)继承,然后 using 指令就不是必需的了,但这是否可以接受(如果 Button 真的"is" HasLabel) 是个人喜好问题。

您还可以使用 CRTP减少具有相似混合对象的样板代码量。

关于c++ - CPP : Class as private member in another class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18664744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com