C ++中的工厂模式。实例化问题

时间:2015-10-14 10:30:47

标签: java c++

我在$('#calloutbox').click(function (evt) { var svg = document.getElementById('canvas'); alert(svg); var localpoint = getlocalmousecoord(svg, evt); if (!mousedownonelement) { createtext(localpoint, svg); } else { mousedownonelement = false; } }); 中实施了一个小Factory class。它的最小化版本看起来像这样:

Java

我喜欢它的工作方式,尤其是方式,我如何实例化特定对象,如:

interface MyClass{
    public void doSomething();
}

class Concrete_1 implements MyClass{
    private String field_1;
    Concrete_1(String _field_1){
        // ... initialization
    }
    public void doSomething(){
        // ... not so important
    }
}

class MyClassFactory{
    public static MyClass init(int idx, String val){
        Concrete_1 ex = null;
        switch(idx){
        case 1:
            ex = new Concrete_1(val);
            break;
        default:
            break;
        }
        return ex;
    }
    public static void main(String args[]){
        MyClass ex = MyClassFactory.init(1, "value"); // <-- I like that
    }
}

现在我想要的是在C ++中实现相同的东西。我已经看过一些例子(包括stackoverflow中的一些线程),但在所有这些例子中,他们使用的是abstarct类(而不是我的Java中的接口)。如果内存服务器是正确的,则无法创建抽象类的实例。所以,如果我们只是简单地将上面的代码移植到C ++并使用一些抽象类而不是接口,它就行不通,因为这是禁止的:

MyClass ex = MyClassFactory.init(1, "value");

我的问题是如何在C ++中做同样的事情?谢谢!

3 个答案:

答案 0 :(得分:3)

在C ++中,可以通过指针访问它:

second

答案 1 :(得分:2)

您可以使用指针或引用来处理它们。例如

std::shared_pointer<MyClass> ptrClass = MyClassFactory.init(1, "value");

由于C ++中的工厂通常返回指针,因此您可能会坚持使用指针选项。并提示:不要使用原始指针。使用共享指针或唯一指针,并从工厂返回共享指针。

更完整的解决方案将是:

class MyClassFactory{
    public:
      MyClass* init(int idx, std::string val){
        switch(idx){
        case 1:
            return new Concrete_1;
        default:
            return nullptr;
        }
    }
};

附加1:

关于返回工厂的类型请看: What is the best smart pointer return type for a factory function?

人们对此发表了评论。我最后把它作为非智能指针留下了,不管怎样,这是一个好主意,请看上面的链接。在我看来,应该始终使用smart_pointers,但是如你所愿。

答案 2 :(得分:1)

在这种情况下,Java和C ++之间的区别在于,在C ++中,您必须使用指针

使用new创建具体类,并将其作为指向基类的指针返回。