假设我有一个类框,用户可以创建框.怎么做?我理解我是className objectName(args);根据用户输入创建对象但是如何动态创建对象?
Pat*_*ick 21
正确答案取决于您要创建实例的不同类的数量.
如果数量巨大(应用程序应该能够在应用程序中创建的任何类的一个实例),你应该使用的.Net的反射功能.但是,说实话,我不是用商业逻辑思考的大风扇,所以我会建议不要这样做.
我认为实际上你想要创建实例的类数量有限.所有其他答案都做出了这个假设.你真正需要的是工厂模式.在接下来的代码中,我还以为它的要创建实例类,都来自同一个基类派生,让我们说动物,就像这样:
class Animal {...};
class Dog : public Animal {...}
class Cat : public Animal {...}
Run Code Online (Sandbox Code Playgroud)
然后创建一个抽象工厂,它是一个创建动物的接口:
class IFactory
{
public:
Animal *create() = 0;
};
Run Code Online (Sandbox Code Playgroud)
然后为每种不同种类的动物创建子类.例如对于Dog类,这将成为:
class DogFactory : public IFactory
{
public:
Dog *create() {return new Dog();}
};
Run Code Online (Sandbox Code Playgroud)
和猫一样.
DogFactory :: create方法否决了IFactory :: create方法,即使它们的返回类型不同.这就是所谓的共变量返回类型.只要子类的方法的返回类型是基类的返回类型的子类,就允许这样做.
你现在可以做的是将所有这些工厂的实例放在一个地图中,如下所示:
typedef std::map<char *,IFactory *> AnimalFactories
AnimalFactories animalFactories;
animalFactories["Dog"] = new DogFactory();
animalFactories["Cat"] = new CatFactory();
Run Code Online (Sandbox Code Playgroud)
用户输入后,您必须找到正确的工厂,并要求它创建动物的实例:
AnimalFactories::const_iterator it=animalFactories.find(userinput);
if (it!=animalFactories.end())
{
IFactory *factory = *it;
Animal *animal = factory->create();
...
}
Run Code Online (Sandbox Code Playgroud)
这是典型的抽象工厂方法.还有其他方法.在自学C++时,我写了一篇关于它的小型CodeProject文章.您可以在此处找到它:http://www.codeproject.com/KB/architecture/all_kinds_of_factories.aspx.
祝好运.
以下工厂方法Box根据用户输入动态创建实例:
class BoxFactory
{
public:
static Box *newBox(const std::string &description)
{
if (description == "pretty big box")
return new PrettyBigBox;
if (description == "small box")
return new SmallBox;
return 0;
}
};
Run Code Online (Sandbox Code Playgroud)
当然,PrettyBigBox和SmallBox无论从派生Box.看一下C++设计模式wikibook中的创建模式,因为其中一个可能适用于您的问题.
| 归档时间: |
|
| 查看次数: |
57401 次 |
| 最近记录: |