C++ 是否可以根据提供给单个构造函数的参数创建派生而不是 bass class?
C++ can I create derived instead of bass class dependent on arguments given to single constructor?
如果我有一个基础 class 和派生 class,是否可以根据传入单个构造函数的参数将实例创建为 bass 或派生 class?
示例代码:
//Base Class
class MyClass {
public:
//All instances created with this constructor
MyClass(int param1, int param2) {
if (param1 > param2) { //(for example)
// TODO - create this object as SubClass instead
} else {
//normal base class construction
}
}
}
//Derived Class
class SubClass {
public:
SubClass(int param1, int param2) {
//Subclass construction
}
void function() {
//function that only works on subclass objects
}
}
MyClass object1(1, 2); //should create MyClass object
MyClass object2(2, 1); //should create SubClass object
如上所示,当创建此 class 的实例时,我希望构造函数正常运行并生成 class,或者(取决于作为参数给出的值)生成它作为派生子类的实例。请注意,它必须基于不同参数的值,而不仅仅是它们的类型。是否有可能做到这一点?如有必要,可以使用另一个派生 class 来表示 'normal' 选项(而不是使用纯低音 class),只要只使用一个构造函数即可。
如果这不可能,我可以在我想要它的一个实例时只调用子类构造函数,但这并不理想,因为我必须检查哪个应该每次创建时都会创建一个,而不是仅在构造函数中进行一次内部检查。
您需要使用面料。根据您的参数,它将 return 指向 parent class 的指针。您将通过 parent class 的界面使用它。参见 https://en.wikipedia.org/wiki/Abstract_factory_pattern and https://en.wikipedia.org/wiki/Factory_method_pattern
您可以将创建委托给MyClass
的静态函数:
class SubClass;
//Base Class
class MyClass {
MyClass(int param1, int param2) {
}
public:
static unique_ptr<MyClass> Create(int param1, int param2) {
if (param1 > param2) { //(for example)
return std::make_unique<SubClass>(param,param2);
} else {
return std::make_unique<MyClass>(param,param2);
}
}
}
//Derived Class
class SubClass : public MyClass {
SubClass(int param1, int param2) {
//Subclass construction
}
public:
void function() {
//function that only works on subclass objects
}
}
std::unique_ptr<MyClass> object1 = MyClass::Create(1, 2); //should create MyClass object
std::unique_ptr<MyClass> object1 = MyClass::Create(2, 1); //should create SubClass object
如果我有一个基础 class 和派生 class,是否可以根据传入单个构造函数的参数将实例创建为 bass 或派生 class?
示例代码:
//Base Class
class MyClass {
public:
//All instances created with this constructor
MyClass(int param1, int param2) {
if (param1 > param2) { //(for example)
// TODO - create this object as SubClass instead
} else {
//normal base class construction
}
}
}
//Derived Class
class SubClass {
public:
SubClass(int param1, int param2) {
//Subclass construction
}
void function() {
//function that only works on subclass objects
}
}
MyClass object1(1, 2); //should create MyClass object
MyClass object2(2, 1); //should create SubClass object
如上所示,当创建此 class 的实例时,我希望构造函数正常运行并生成 class,或者(取决于作为参数给出的值)生成它作为派生子类的实例。请注意,它必须基于不同参数的值,而不仅仅是它们的类型。是否有可能做到这一点?如有必要,可以使用另一个派生 class 来表示 'normal' 选项(而不是使用纯低音 class),只要只使用一个构造函数即可。
如果这不可能,我可以在我想要它的一个实例时只调用子类构造函数,但这并不理想,因为我必须检查哪个应该每次创建时都会创建一个,而不是仅在构造函数中进行一次内部检查。
您需要使用面料。根据您的参数,它将 return 指向 parent class 的指针。您将通过 parent class 的界面使用它。参见 https://en.wikipedia.org/wiki/Abstract_factory_pattern and https://en.wikipedia.org/wiki/Factory_method_pattern
您可以将创建委托给MyClass
的静态函数:
class SubClass;
//Base Class
class MyClass {
MyClass(int param1, int param2) {
}
public:
static unique_ptr<MyClass> Create(int param1, int param2) {
if (param1 > param2) { //(for example)
return std::make_unique<SubClass>(param,param2);
} else {
return std::make_unique<MyClass>(param,param2);
}
}
}
//Derived Class
class SubClass : public MyClass {
SubClass(int param1, int param2) {
//Subclass construction
}
public:
void function() {
//function that only works on subclass objects
}
}
std::unique_ptr<MyClass> object1 = MyClass::Create(1, 2); //should create MyClass object
std::unique_ptr<MyClass> object1 = MyClass::Create(2, 1); //should create SubClass object