Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;用字符串构造类_C++_Class_Abstract_Base_Derived - Fatal编程技术网

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
应该适合您的情况。但是,如果要使用其他字符串调用它,则传递引用意味着更少的复制。传递对常量的引用意味着您可以传递字符串文本或临时对象,并告诉编译器该函数不会修改函数,这可能会启用某些优化(在本例中不太可能),并简化其语义检查。