不能在从vector派生的类中交换结构

时间:2014-12-22 01:29:58

标签: c++ vector struct

我有一个派生自vector的类,它的数据元素包含结构。我的问题是,当我尝试使用swap或任何其他方法将结构从一个元素移动到另一个元素时,我会遇到错误。这是我的班级和结构:

#ifndef PRIQUEUE
#define PRIQUEUE

#include "PriQueueError.h"
#include <vector>
using std::vector;

const int EMPTY_QUEUE = 1;

template <class T>
struct qElem
{
    T Data;
    int Priority;
    qElem(T data, int priority) :Data(data), Priority(priority){};
};

template <class T, class T2>
class PriQueue : public vector<T2>
{
public:
    PriQueue(){}
    PriQueue(T data, int priority);
    void enqueue(T data, int priority);
    T dequeue() throw(PriQueueError);
    T qPeek() throw(PriQueueError);
    int qSize();
};


template <class T, class T2>
PriQueue<T, T2>::PriQueue(T data, int priority)
{
    this->enqueue(data, priority);
}
template <class T, class T2>
void PriQueue<T, T2>::enqueue(T data, int priority)
{
    qElem<T> tmp1(data, priority);
    this->push_back(tmp1);
    bool flag(false);

    if (this->qSize() > 1)
    {
        for (int i = this->qSize() - 1; i > 0 || flag == false; i--)
        {
            flag = true;
            if (tmp1.Priority < tmp2.Priority)
            {
                std::swap(this[i], this[i-1]);
                flag = false;
            }
        }
    }
}
template <class T, class T2>
T PriQueue<T, T2>::dequeue() throw(PriQueueError)
{
    if (this->empty())
        throw PriQueueError("Empty Queue!");

    T tmp = this->qPeek();
    this->pop_back();
    return tmp;
}
template <class T, class T2>
T PriQueue<T, T2>::qPeek() throw(PriQueueError)
{
    if (this->empty())
        throw PriQueueError("Empty Queue!");

    qElem<T> tmpStruct = this->back();
    T tmpData = tmpStruct.Data;
    return tmpData;
}
template <class T, class T2>
int PriQueue<T, T2>::qSize()
{
    return this->size();
}

#endif

enqueue函数有点乱,因为我对它进行了不断的更改以使其工作。我读到它的任何地方都说要访问向量的数据成员,你只需要使用nameofclass [index] .member或this [index] .member。在我创建类的实例(qInt)时,我可以使用qInt [index] .Data访问结构,但我不能通过这个[index] .Data。当我在enqueue内部并尝试交换(这[index],这[anotherIndex])时它会出错。当我尝试在调试器监视窗口中提取此[0]和[1]的信息时,它应该给出向量的第一个和第二个索引位置,它告诉我所有内容都在这个[0]内。我迷失在我在这里做的事情,我的课程是从矢量派生出来的,因此应该像我想的那样行事,但似乎根本就没有这样做。

1 个答案:

答案 0 :(得分:3)

从vector(或任何其他标准容器)派生是个坏主意。他们的目的是成为班级成员;你应该改为vector<T2>类型的成员变量。派生没有获得任何东西,但它确实引入了问题(切片,通过基类指针删除,成员函数中的笨拙语法等)。

您的直接问题是this是一个指针,因此您需要this[0](*this)[0]代替this->operator[](0)