1

我有从具有虚函数的基类继承的派生类。我使用智能指针(shared_ptr)来创建对象,因为我希望将对象附加到向量中。但是我注意到我的代码在处理对象以执行某些任务时是重复的,所以我认为模板可以成为改进我的代码的解决方案。这是我迄今为止的尝试(不是确切的代码,简化):

class Base{

    public:
     virtual ~Base(){}
     virtual void display_message() = 0;
};

class DerivedA : public Base{
    DerivedA(){}
};

class DerivedB : public Base{
    DerivedB(){}
};



//THE template- 
//<hold the smart pointer that points to different derived objects>

template<typename T1>

class HandleInstances{
      private:            

         vector<T1> ObjectVector;
         //the iterator

         T1 sp_base;

      public:

        HandleInstance(const T1 & sp){
            sp_base = sp; // set smart pointer
        }
        //somefunctions

        //this is what i need to figure out
        void AddToVector(){
             ObjectVector.push_back(sp_base(new 'The derived class') );
        }



};

AddToVector 函数是这里的问题。为了添加一个对象的元素,我必须这样做 push_back("the smart pointer"(new "the class"));。我如何让模板接受类(不是对象)并将其实现到 push_back() 的函数中?

4

3 回答 3

1

您正在尝试将对象用作类,但这不起作用(除非对象具有operator()返回正确对象的对象,但我离题了)。

请尝试:

void AddToVector(){
    ObjectVector.push_back(T1(sp_base));
}

这将创建一个新对象,并调用新对象的复制构造函数并传递sp_base给它。所以本质上是创建一个sp_base.

于 2012-08-16T21:15:34.323 回答
0

将该函数也设为模板:

template<typename T2>
void AddToVector(){
    ObjectVector.push_back(smart(new T2));
}

我假设您打算在push_backrether 中有一个智能指针,而不是您的成员变量sp_base

于 2012-08-16T21:15:14.353 回答
0

这是一个具有挑战性的问题 - 为什么?因为模板通过基于模板参数动态构造类的变体来作为 C++ 中的一种预处理步骤。

换句话说,彼此shared_ptr<DerivedA>之间shared_ptr<DerivedB>没有任何关系,因为在 C++ 中,模板本质上使它们像 2 个独立的类声明 - 不相关的类型。

它们包含的指针都是基类的后代,但 shared_ptrs 本身也可能是 aVector<Bool>和 a FooDerivedA从单个基类继承并没有关系DerivedB,它们的模板生成的类没有。

话虽如此,您确实具有一定的灵活性:如果您将工厂函数放在类的接口中,如下所示:

class DerivedA : public Base{
    public:
    static shared_ptr<DerivedA> construct{
        return shared_ptr<DerivedA>(new DerivedA());
    };
};

....similar for DerivedB

然后你可以做这样的事情:

template<typename T>
class HandleInstances{
  private:            

     vector<shared_ptr<T> > ObjectVector;

  public:

    //this is what i need to figure out
    void AddToVector(){
         ObjectVector.push_back(T::construct());
    }
};

你应该没事。你正在做的是给每个类一个函数来弥补这个类本身不能被存储以在以后生成对象的事实。注意:

  1. HandleInstances 中的模板参数是基本类型,而不是 shared_ptr 类型。
  2. Construct在 DerivedA 和 DerivedB 中返回不同的类型。
  3. Base没有声明construct- 因为这些函数不返回兼容类型,所以它们不是从 Base 继承的。
  4. 你仍然不能在你的 ObjectVector 中混合和匹配类型,如果那是你所希望的——但无论如何你永远无法做到这一点。(奖励:如果你使用更多类型来包装你的类型并处理这个是可能的:见boost::any
于 2012-08-16T22:19:58.653 回答