是否可以在 运行 时间确定对象选择的情况下使用 C++ 对象组合?
Is it possible to use C++ object composition where choice of object is determined at run-time?
假设我有一张 class 脸。我希望使用组合来构建面部。脸部有眼睛,所以我可以创建一个 class 眼睛并使用合成将眼睛添加到脸部。
但是,如果我 class 眼睛,例如
class Eyes { ... };
class BlueEyes : public Eyes { ... };
class BrownEyes : public Eyes { ... };
? (假设接口都是相同的。)
是否可以在 运行 时间合成人脸,比如根据提供给构造函数的某些参数,人脸会得到 BlueEyes 或 BrownEyes?
你要找的是工厂设计模式。
您的工厂收到要实例化的 class 的名称和任何必需的参数,然后实例化适当的子 class。该名称可以采用字符串、枚举类型或任何其他选择适当 subclass 的方式的形式。让我们使用一个字符串:
Eyes *create_eyes(const std::string &color)
{
if (color == "blue")
return new BlueEyes;
if (color == "brown")
return new BrownEyes;
throw "Unknown eye color";
}
您可以通过编写一个指向基数 class 的指针来做到这一点。例如,
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,经常使用这个。
假设我有一张 class 脸。我希望使用组合来构建面部。脸部有眼睛,所以我可以创建一个 class 眼睛并使用合成将眼睛添加到脸部。
但是,如果我 class 眼睛,例如
class Eyes { ... };
class BlueEyes : public Eyes { ... };
class BrownEyes : public Eyes { ... };
? (假设接口都是相同的。)
是否可以在 运行 时间合成人脸,比如根据提供给构造函数的某些参数,人脸会得到 BlueEyes 或 BrownEyes?
你要找的是工厂设计模式。
您的工厂收到要实例化的 class 的名称和任何必需的参数,然后实例化适当的子 class。该名称可以采用字符串、枚举类型或任何其他选择适当 subclass 的方式的形式。让我们使用一个字符串:
Eyes *create_eyes(const std::string &color)
{
if (color == "blue")
return new BlueEyes;
if (color == "brown")
return new BrownEyes;
throw "Unknown eye color";
}
您可以通过编写一个指向基数 class 的指针来做到这一点。例如,
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,经常使用这个。