gpt4 book ai didi

c++ - 在 C++ 中构建类的最佳方式

转载 作者:搜寻专家 更新时间:2023-10-31 02:24:30 25 4
gpt4 key购买 nike

很长一段时间以来,我一直在思考类结构的以下方面。让我们看看我们有 Style 类,它存储字体大小、字体颜色和其他字体样式设置。我们还有一个字体类。现在我们有两种方法来描述我们的任务。第一个是:

class Style {
public:
unsigned short size;
unsigned short color; // just for example
};

class Font{
private:
Style style;
public:
void setSize( unsigned short fontSize ) {
this->style.size = fontSize;
}
void setColor( unsigned short fontColor ) {
this->style.color = fontColor;
}
void setStyle( Style style ) {
this->style = style;
}
};

第二个是:

class Style {
private:
unsigned short size;
unsigned short color; // just for example
public:
void setSize( unsigned short fontSize ) {
this->style.size = fontSize;
}
void setColor( unsigned short fontColor ) {
this->style.color = fontColor;
}
};

class Font{
private:
Style style;
public:
void setStyle( Style style ) {
this->style = style;
}
};

我在我的应用中经常使用 Style-object:

Style style;
style.size = 10;
style.color = 02034023; // doesn't matter :)
font.setStyle( style );

因此,如果我们在 Style 类中定义 setColor、setFont 和其他空值,我们就会将它们全部加载到我们的内存中(通过 Style 对象的每个拷贝)。如果我们在 Font 类中定义 setColor 和其他方法,我们只会将 setColor 的一个拷贝加载到内存中。由于我经常使用 Style 对象的创建,所以我不想在内存中加载 setColor 和其他对象,只是为了有机会像这样使用此类:style.setSize(10);。使用这种技术,我只在内存中加载 setSize 和其他拷贝的一个拷贝。

你怎么看?您使用哪些结构,为什么?

最佳答案

选项1

优点:Style对象的部分封装
缺点:您必须为Style 中的每个字段提供Font 中的方法。这可能适用于像这样的简单应用程序,但想象一下您将拥有 Paragraph 类,该类将具有其 FontContent 字段(或可能更多) .那么您将不得不使用选项 2 或再次重写 Font 中的所有方法。

选项 2

优点:您可以从层次结构的任何级别完全访问 Style 对象
缺点:每次要更改某些内容时都必须实例化一个新对象。对象生命周期/所有权出现问题。(我是否删除此处的样式?是否在其他地方引用了它?)。样式对象没有封装。

我的建议

使用 getter 的常量正确性:

class Style
{
public:
unsigned short size;
unsigned short color; // just for example
};

class Font
{
private:
Style style;
public:
const Style& GetStyle() const { return style; }
Style& GetStyle() { return style; }
};

通过这种方式,您可以明确声明 Style 对象的所有权属于 Font,同时还可以在给定位置读取/更改它,即font.GetStyle().size = 14;

您还可以使用函数签名来清楚地说明内部 Font 发生的情况。

void AccessFont(const Font& font)
{
unsigned size = font.GetStyle().size; // works
font.GetStyle().size = 16; // doesn't compile
}

再说一次,如果您使用提到的 Paragraph 类进入层次结构,您只需为 Font 字段添加两个 getter。然后,您可以传递 Paragraph 的 const 和非常量版本。

关于c++ - 在 C++ 中构建类的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27979797/

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