2016-02-13 25 views
1

说我有一个班的脸。我希望使用构图来构建Face。脸上有眼睛,所以我可以创建一个班级的眼睛,并使用组合为眼睛添加眼睛。在运行时确定对象的选择是否可以使用C++对象组合?

但如果我眼中的子类,例如

class Eyes { ... }; 
class BlueEyes : public Eyes { ... }; 
class BrownEyes : public Eyes { ... }; 

? (假设接口都是相同的。)

是否有可能构成在运行时脸,说根据提供给构造函数的脸就会得到任意BlueEyes或BrownEyes一些参数?

+0

这正是为什么有相对于继承对象组合? – iksemyonov

+4

'Face'的类型应该是'性病的成员::的unique_ptr '并在运行时创建正确的期望类型,例如'颜色==眼睛::布朗?新的BrownEyes:新的BlueEyes“并在'unique_ptr'成员中管理该指针。 (确保'Eyes'有一个虚拟析构函数)。 –

回答

4

您可以通过组合一个指向基类的指针来实现这一点。例如,

enum EyeColor{Blue, Brown}; // Even better would be enum class 

class Face 
{ 
private: 
    // Here is the composition - to a base-class ptr. 
    std::unique_ptr<Eyes> m_eyes; 

public: 
    explicit Face(EyeColor c) 
    { 
     // Use c to instantiate m_eyes below to the appropriate-class object. 
    } 
}; 

事实上,C++实现的一些设计模式,例如,Strategy,通常采用此。

+0

是的。例如'm_eyes = std :: unique_ptr (new BrownEyes());'谢谢。 – PartialOrder

0

你所寻找的是工厂设计模式。

你的工厂接收到的名字之类的实例,以及任何需要的参数,然后实例化相应的子类。该名称可以采用字符串,枚举类型或任何其他方式选择适当的子类。让我们使用一个字符串:

Eyes *create_eyes(const std::string &color) 
{ 
    if (color == "blue") 
      return new BlueEyes; 

    if (color == "brown") 
      return new BrownEyes; 

    throw "Unknown eye color"; 
} 
+3

这应该是返回'unique_ptr',或者如果你被困在过去,'auto_ptr' –

+0

说谁? ...... –

+1

聪明的程序员,想要异常安全且无缺陷的代码。原始指针没有什么优势,*尤其是*作为返回值和类成员。 –

相关问题