我在$('#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 ++中做同样的事情?谢谢!
答案 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
创建具体类,并将其作为指向基类的指针返回。