我有一个派生自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]内。我迷失在我在这里做的事情,我的课程是从矢量派生出来的,因此应该像我想的那样行事,但似乎根本就没有这样做。
答案 0 :(得分:3)
从vector(或任何其他标准容器)派生是个坏主意。他们的目的是成为班级成员;你应该改为vector<T2>
类型的成员变量。派生没有获得任何东西,但它确实引入了问题(切片,通过基类指针删除,成员函数中的笨拙语法等)。
您的直接问题是this
是一个指针,因此您需要this[0]
或(*this)[0]
代替this->operator[](0)
。