有没有办法在不使用模板的情况下从该类创建类的实例?
我需要做一些想法
static classobj* classobj::create (){return new this;}
现在我使用类模板并传递给可创建类的模板类型,如:
template<class T>
class basic_class {
public:
static T *create(int param) { return new T(param); }
}
和
class A : public basic_class<A> {}
答案 0 :(得分:5)
为什么不呢?
return new classobj;
或者这个:
return new decltype(*this);
但请不要这样做。函数返回的指针具有不明确的所有权语义。我们现在通常不需要原始指针。
答案 1 :(得分:2)
如果我理解你的问题,你想创建一个非模板类:
class Base
{
public:
static (Magic)* create() { return new (Magic); }
}
然后我们会这样称呼这个方法:
class Derived : public Base {};
Derived* object = Derived::create();
问题是:我们用什么咒语代替&#34;(魔术)?&#34;不幸的是,没有这样的语法。静态类方法就像常规函数一样。所有涉及的类型必须在声明函数时知道。
您能详细说明为什么不想使用模板吗?也许还有另一种解决问题的方法。
答案 2 :(得分:1)
首先实现复制构造函数
classobj(const classobj& obj);
然后
return new classobj(*this)
答案 3 :(得分:1)
如果我理解你的问题,那么你必须为每个类添加静态创建:
class A
{
public:
//to create
static A* create(int param) { return new A(param); }
};
然后执行此操作:
A* ptr = A::create(4);
或更好,避免内存泄漏
std::unique_ptr<A> uptr(A::create(4));
或者,如果您的问题是在任何构造函数的basic_class中进行“智能”创建,那么在C ++ 11中执行此操作:
template <class T>
class base_class
{
public:
template<typename... Params>
static T* construct(Params&&... parameters) { return new T(std::forward<Params>(parameters)...); }
};
class A : public base_class<A>
{
public:
A(const std::string& s) {}
A(int i) {}
};
等等
A::create(std::string("Hey"));
A::create(5);
现在都在工作。
编辑:基类定义“构造”方法。所以上面应该是
A::construct(std::string("Hey"));
A::construct(5);