背景:我有一个class Button
,其中包含状态数据,纹理和一些成员函数,如draw()
。现在我想创建包含Button对象(class Buttons
)向量的新vector<Button> ButtonList
,以及用于维护它们并可能根据点击触发操作的成员函数。 Button
位于单独的标头和cpp文件中。 ~Buttons
负责删除单个Button
个对象。
问题:我是否在继承Button类方面获得了优势,而不仅仅是#include Button
?或者我应该注意哪些陷阱。
我打算在以后扩展Button
课程。
我可能会过度思考这一点,而且我对课程还很陌生。
包括的例子:
#include <vector>
#include "Button.h"
class Buttons
{
public:
Buttons();
~Buttons();
void addButton(int ID);
void removeButton(int ID);
void updateButtons();
private:
std::vector<Button> buttonList;
};
继承的例子:
#include <vector>
#include "Button.h"
class Buttons:Button
{
public:
Buttons();
~Buttons();
void addButton(int ID);
void removeButton(int ID);
void updateButtons();
private:
std::vector<Button> buttonList;
};
答案 0 :(得分:3)
你应该不使Buttons
继承Button
,因为使用类型为Buttons
的对象没有意义Button
1}}是预期的。
继承是两个(或更多)类中最强的关系,它不应该用于简单的代码重构,更不能用于定义“集合”关系。
答案 1 :(得分:2)
问题:继承Button类是否有任何优势, 而不只是
#include Button
?
这个特殊问题没有意义,因为问题是正交的。带有std::vector
的继承和合成都需要Button
的完整定义,因此需要#include "button.h"
。
我可能会过度思考这一点,而且我对课程还很陌生。
如果有疑问,赞成合成优于继承。
#include <vector> #include "Button.h" class Buttons { public: Buttons(); ~Buttons(); void addButton(int ID); void removeButton(int ID); void updateButtons(); private: std::vector<Button> buttonList; };
这是一个非常好的解决方案。你不可能得到比这更清晰的C ++。
class Buttons:Button
相比之下,这条线没有多大意义。它使用私有继承来模拟合成,因为类型是class
。我很确定这绝对不是你的意图。如果您的班级已经包含Button
,
std::vector<Button>
该行显示为&#34;按钮对象包含一个按钮&#34; 。
当然,公共继承会更有意义:
class Buttons : public Button
这将显示为&#34;按钮对象 一个按钮&#34; 。
private: std::vector<Button> buttonList;
因此,结合这一行,上面的两个继承版本意味着&#34;一个按钮对象包含一个按钮,还有一些按钮&#34; 或&#34;按钮对象 一个按钮,还包含一些按钮&#34; 。
底线:使用无继承版本。
然而,你的问题还有一句话听起来有点令人担忧:
~Buttons
负责删除单个Button
个对象。
是的,但只是非常间接,因为std::vector
析构函数会自动执行此操作。事实上,在您展示的代码中,您根本不需要声明析构函数。如果你在析构函数中做了额外的工作,那么可能会出现问题。