通用类对象的数组C ++

时间:2017-04-22 02:38:28

标签: c++ arrays object generics queue

我有一个通用类Queue,它包含一个模板Ttype2,作为将存储在每个节点的信息字段中的数据类型的放置持有者。  在我的驱动程序类中,我想实例化一个Queue类对象的数组,但我似乎无法弄明白。我该怎么做呢?

这些没有用,但说明了我想要完成的事情:

// Queue Complex[] = new Queue();//invalid use of template name without identifier list
 //Queue<Ttype2> Complex[]; //template arg 1 is invalid
// vector<Queue> Complex2[];//invalid template arguments`

Queue.h头部中的队列类声明和构造函数:

template <typename Ttype2>
class Queue
{
  // Global Data Items
  protected:
  Node <Ttype2> Front, Rear;
  int Length;

  // member function prototypes
  public:
  Queue();
  void AddRear(Node <Ttype2> ThisNode);
  Node <Ttype2> RemoveFront();
  void Modify(int Position, Node <Ttype2> ThisNode);
  void ClearAll();
  int GetSize();`
  Node <Ttype2> GetNode(int Position);
  Node <Ttype2>* toArray();
};`

// Constructor
template <typename Ttype2>
Queue <Ttype2> :: Queue()
{
  Rear = Front = NULL;
  Length = 0;
} // End of Constructor
`

2 个答案:

答案 0 :(得分:0)

这有效:

Queue<int> *Complex = new Queue<int>();
Queue<int> Complex[1];
vector<Queue<int>> Complex2[1];

在实例化模板时,您需要为模板提供真正的参数。

Queue<Ttype2> // Ttype2 isn't a real type, use int, char, ...

您还需要定义类型Node<>。如果您想将NULL分配给RearFront,请先考虑将它们作为指针,然后再使用nullptr代替NULL

答案 1 :(得分:0)

我将添加Yola的解决方案,如果我想在一个数组中保留许多不同的Queue<XXX>, 我通常创建一个接口类Queue_base

class Queue_base{
    public: virtual void func()=0;
};

template <typename Ttype2>class Queue : public Queue_base{
    public: void func(){
        //... some code
    }
};

int main() {
    Queue_base* complex[2];
    complex[0]=new Queue<int>();
    complex[1]=new Queue<float>();
    complex[0]->func(); 
    std::vector<Queue_base*> complex2;
    complex2.push_back(new Queue<char>());
    Queue<int>* c1=static_cast<Queue<int>*>(complex[0]);
    return 0;
}

这是直播demo 请注意,使用虚函数会降低性能。

它也会丢失类型(减少到Queue_base*)并限制某些函数调用,但它对某些实际情况很有用。

要扩展其使用率Node<T>,也可以从具有Node_Base所有常用功能的新类Node<T>继承,例如template <typename Ttype2> class Queue : public Queue_Base{ // Global Data Items protected: Node_Base* Front; //Front = new Node<Ttype2>(); Node_Base* Rear; 。 : -

.notification {
  display: flex;
}

.push-title {
  font-size: 1.15rem;
}

.push-active {
  margin-left: 20%;
  color: #8A8A8A;
}

.btn-active {
  margin-left: 3%;
  background: #FF512F;
  background-image: -webkit-linear-gradient(left top, #FF512F, #DD2476);
  background-image: -moz-linear-gradient(left top, #FF512F, #DD2476);
  background-image: -ms-linear-gradient(bottom right, #FF512F, #DD2476);
  background-image: -o-linear-gradient(bottom right, #FF512F, #DD2476);
  background-image: linear-gradient(bottom right, #FF512F, #DD2476);
  -webkit-border-radius: 60;
  -moz-border-radius: 60;
  border-radius: 60px;
  padding: 0 10px;
  text-decoration: none;
  display: flex;
  align-items: center;
    width: 38px;
    height: 22px;
    justify-content: flex-start;
}
.btn-active span {
  display: block;
  padding: 5px;
  background: green;
  border-radius: 50%;
}

这取决于你的需求。