我使用不同的协议进行TTY通信。我开始用C ++实现一些C ++代码。父类包含一些具有一些虚函数的基本函数(write,read ...)。每个协议都是具有特定功能的子类。目前在我的应用程序中,我直接使用我的子类,但我想动态更改协议。
在这种情况下是否可以使用父类作为子类的自动选择器来选择?并且在选择之后仍然使用父母?
例如(简化):
class Parent
{
void Write();
void Read();
void AutomaticProtocolSelector();//depending on the response of the device
virtual void function1();
virtual void function2();
};
class protocol1 : public Parent
{
void function1();
};
class protocol2 : public Parent
{
void function2();
};
int main(int argc, char const *argv[])
{
Parent *p;
p->AutomaticProtocolSelector();//let's say protocol1 is selected
p->function1(); //execute the function1 in the child class
...
}
我已经阅读了一些有关派生类以及使用dynamic_cats
和static_cast
的帖子,但这并不是我正在寻找的内容。如果按照我的想法不可能,我会用它。
答案 0 :(得分:0)
你似乎陷入了一种引导问题。您希望使用指向Parent
的指针来创建Parent
类的实现。在您的程序中,您将取消引用尚未初始化的指针。
int main(int argc, char const *argv[])
{
Parent *p; // !! Not initialized
p->AutomaticProtocolSelector(); // The application should crash here
p->function1();
// ...
}
最好将你的指针初始化为nullptr
,这可能会让一些可疑的东西变得更加明显。
要让Parent
类提供自身的实现,您需要一个静态工厂方法。
class Parent
{
public:
static std::unique_ptr<Parent> createParent();
void Write();
void Read();
virtual void function1();
virtual void function2();
};
然后可以在您的应用程序中使用它,如下所示:
int main()
{
auto p = Parent::createParent();
p->function1();
p->function2();
// ...
}
但是,这也意味着在Parent
的实现中,您需要了解一些或所有可能的子类。这感觉有点倒退,您通常不希望您的父类知道他们的子类。
正如Alexandre Thouvenin所建议的那样,最好将儿童班的建设转移到一个单独的工厂班级。
class ParentFactory
{
public:
ParentFactory() = default;
std::unique_ptr<Parent> createParent() const;
};
在createParent
方法的实现中,然后创建其中一个子类的实例。
然后在您的应用程序代码中,创建一个工厂并使用它来获取Parent
类的实现。
int main()
{
ParentFactory factory;
auto p = factory.createParent();
p->function1();
p->function2();
// ...
}
注意:我使用了一些C ++ 11功能,希望你不介意。