创建"对象的新实例" C ++中的方法

时间:2015-11-06 15:58:36

标签: c++

有没有办法在不使用模板的情况下从该类创建类的实例? 我需要做一些想法 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> {}

4 个答案:

答案 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);