class IParser
{
public:
virtual ~IParser(){}
virtual void parse() = 0;
};
{
public:
virtual ~IParser(){}
virtual void parse() = 0;
};
class Parser1 : public IParser
{
public:
Parser1()
{
cout<<"Parser1"<<endl;
}
{
public:
Parser1()
{
cout<<"Parser1"<<endl;
}
~Parser1()
{
cout<<"~Parser1"<<endl;
}
{
cout<<"~Parser1"<<endl;
}
void parse() override
{
cout<<"Parser1::parse"<<endl;
}
};
Q_DECLARE_METATYPE(Parser1)
{
cout<<"Parser1::parse"<<endl;
}
};
Q_DECLARE_METATYPE(Parser1)
class Parser2 : public IParser
{
public:
Parser2()
{
cout<<"Parser2"<<endl;
}
{
public:
Parser2()
{
cout<<"Parser2"<<endl;
}
~Parser2()
{
cout<<"~Parser2"<<endl;
}
{
cout<<"~Parser2"<<endl;
}
void parse() override
{
cout<<"Parser2::parse"<<endl;
}
};
Q_DECLARE_METATYPE(Parser2)
{
cout<<"Parser2::parse"<<endl;
}
};
Q_DECLARE_METATYPE(Parser2)
IParser* factory(const char* parseName)
{
int id = QMetaType::type(parseName);
if (id == -1)
{
return nullptr;
}
{
int id = QMetaType::type(parseName);
if (id == -1)
{
return nullptr;
}
IParser* parse = static_cast<IParser*>(QMetaType::create(id));
return parse;
}
}
int main(int argc, char *argv[])
{
{
qRegisterMetaType<Parser1>("Parser1");
qRegisterMetaType<Parser2>("Parser2");
std::shared_ptr<IParser> parse1(factory("Parser1"));
std::shared_ptr<IParser> parse2(factory("Parser2"));
parse1->parse();
parse2->parse();
qRegisterMetaType<Parser2>("Parser2");
std::shared_ptr<IParser> parse1(factory("Parser1"));
std::shared_ptr<IParser> parse2(factory("Parser2"));
parse1->parse();
parse2->parse();
return 0;
}