C++ C++;用字符串构造类
假设我有两个从同一个基类派生的类。我想根据命令行输入实例化一个新的类对象。我可以这样做:C++ C++;用字符串构造类,c++,class,abstract,base,derived,C++,Class,Abstract,Base,Derived,假设我有两个从同一个基类派生的类。我想根据命令行输入实例化一个新的类对象。我可以这样做: #include <iostream> #include "DerivedClass1.h" #include "DerivedClass2.h" using namespace std; int main(int argc, char *argv[]) { if (argv[1] == "DERIVED CLASS 1") { DerivedClass1 *myCla
#include <iostream>
#include "DerivedClass1.h"
#include "DerivedClass2.h"
using namespace std;
int main(int argc, char *argv[])
{
if (argv[1] == "DERIVED CLASS 1") {
DerivedClass1 *myClass = new DerivedClass1(argv[2]);
myClass->doSomething();
} else if (argv[1] == "DERIVED CLASS 2") {
DerivedClass2 *myClass = new DerivedClass2(argv[2]);
myClass->doSomething();
}
}
#包括
#包括“DerivedClass1.h”
#包括“DerivedClass2.h”
使用名称空间std;
int main(int argc,char*argv[])
{
如果(argv[1]=“派生类1”){
DerivedClass1*myClass=新的DerivedClass1(argv[2]);
myClass->doSomething();
}else if(argv[1]=“派生类2”){
DerivedClass2*myClass=新的DerivedClass2(argv[2]);
myClass->doSomething();
}
}
但我想知道是否有更优雅的方式来做到这一点。我正在考虑创建一个抽象类工厂,或者用硬代码将字符串名称映射到类实例。
几个限制
1) 我的基类是抽象的-它包含纯虚拟函数
2) 我只能调用参数化构造函数,工厂函数应该可以正常工作:
BaseClass* create(std::string const& type, std::string const& arg)
{
// Could use a map or something instead if there are many alternatives
if (type == "DERIVED CLASS 1")
return new DerivedClass1(arg);
else if (type == "DERIVED CLASS 2")
return new DerivedClass2(arg);
else
return nullptr; // Or throw an exception or something else
}
用作
BaseClass* ptr = create(argv[1], argv[2]);
argv[1]=“派生类1”
是一个错误,您必须创建工厂设计模式。此链接可能有用@M.M有什么问题?它比较argv[1]
是否指向存储“派生类1”
的内存位置(它永远不会指向该位置)。为什么类型必须是字符串常量&?@ahhhjulie您不必将其作为常量字符串对象的引用,简单的std::string
应该适合您的情况。但是,如果要使用其他字符串调用它,则传递引用意味着更少的复制。传递对常量的引用意味着您可以传递字符串文本或临时对象,并告诉编译器该函数不会修改函数,这可能会启用某些优化(在本例中不太可能),并简化其语义检查。