C++:组合接口(interface)

标签 c++ class interface composition

所以我花了一些时间思考这个问题,并在谷歌上到处寻找“解决方案”(解决方案很可能是一个偏好问题,但我不确定这一点)。下面是我遇到的问题,但是这个问题可以应用于很多关于合成的情况。

我有一个类,颜色,包含红色、绿色、蓝色和 alpha 的成员。其中每一个都有一个 set 和 get 成员函数。很简单。

class Colour
{
    public:
        float getRed();
        void setRed(float);
        float getGreen();
        void setGreen(float);
        ...
    private:
        float red;
        float green;
        ...
};

我将在其他类中使用此类来指定它们的颜色,例如(为简洁起见省略了构造函数和析构函数):

class ColourableObject
{
    private:
        Colour colour;
};

现在我的问题是:这个 ColourableObject 类如何最好地访问这个 Color 对象?是否最好检索 Color 对象以直接访问其成员函数,如下所示:

class ColourableObject
{
    public:
        Colour& getColour();
    private:
        Colour colour;
};

或者,为 ColourableObject 类提供它自己的集合并获取颜色函数是否会更好,在这些函数中作用于 Color 对象,如下所示:

class ColourableObject
{
    public:
        float getRed();
        void setRed(float);
        ...
    private:
        Colour colour;
};

对我来说,前者是最合乎逻辑的,因为它可以通过简单地直接作用于此 Color 对象来省去向需要此 Color 对象的每个类添加功能的麻烦。

但是,后者不是更容易受到 ColourableObject 类更改的影响吗?更不用说 colourableObject.getColour().setRed(x) 对我来说似乎不太自然,因为 get 和 set 相互冲突。

我可能完全采用了错误的方法。我对 C++ 比较陌生,所以我愿意学习!那么问题来了,我应该使用前一种方法,后一种方法,还是完全不同的方法?

最佳答案

不是直接回答你的问题,但我会去掉所有的 setter(在任何情况下通常是一个不好的迹象),并使用构造函数:

Color c = Color( 123, 17, 77 );

其中三个构造函数参数是 RGB 值。

关于C++:组合接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2001725/

相关文章:

c++ - Friend 类及其所有后代

c++ - 从文本文件/XML 文件创建 C++ 类

C++ 模板数组类 : Error generation depends on whether it inherits an interface or not

java - 为什么我的intelliJ IDEA不建议我实现 `Parcelable`接口(interface)的更多方法?

c++ - C++中的空指针

c++ - C++初学者(计算和输出分数)

c++ - 为什么 C++17 标准没有带来部分类模板参数推导?

Java - 转换为接口(interface),然后找出转换的类型是什么

c++ - 如何正确构建静态库?

C++11 将 vector 传递给构造函数