根据要求,我发布了code in idone.com 的其余部分
所以我必须创建自己的Vector Class而且我做了。这是必需的。 当我在另一个类中实现它时,它给了我these errors 这就是我试图实现它的方式:
#include "Vector.h"
class UserDB
{
private:
Vector<AccountInfo*> _accounts;
//more code that previous to this implementation worked fine.
};
我希望有人可以告诉我该怎么做。我对这一点完全无能为力。 Java从来没有给出过这样的错误......
编辑:我也意识到,当我说Vector<int> _accounts;
之类的东西时,它运行完全正常,但是当使用像Vector这样的类时,似乎几乎不可能修复它。我正在阅读很多内容,但我似乎仍无法找到解决方法。
这是我的矢量标题
#include "ArrayClass.h" //Class with more methods
#include "AbstractVector.h" //Another class with more method
template <class DT>
class Vector: virtual public ArrayClass<DT>,
virtual public AbstractVector<DT>
{
protected:
int _currSize;
int _incFactor;
public:
Vector ();
Vector (int n);
Vector (int n, DT& val);
Vector (const Vector<DT>& v);
Vector (const ArrayClass<DT>& ac);
virtual ~Vector();
void operator= (const Vector<DT>& v);
void operator= (const ArrayClass<DT>& ac);
virtual void insert (const DT& item, int index);
virtual void remove (int index);
virtual void add (const DT& item);
virtual int size() const;
virtual int capacity() const;
virtual int incFactor() const;
virtual void setIncFactor(int f);
void setCapacity(int c);
};
这个是实际代码Vector.cpp
#include "Vector.h"
template <class DT>
Vector<DT>::Vector () : ArrayClass<DT>()
{
_currSize = 0;
_incFactor = 5;
}
Vector<DT>::~Vector ()
{
_currSize = NULL;
_incFactor = NULL;
}
template <class DT>
Vector<DT>::Vector (int n): ArrayClass<DT>(n)
{
_currSize = 0;
_incFactor = (n+1)/2;
}
template <class DT>
Vector<DT>::Vector (int n, DT& val)
: ArrayClass<DT>(n, val)
{
_currSize = 0;
_incFactor = n/2;
}
template <class DT>
Vector<DT>::Vector (const Vector<DT>&v)
: ArrayClass<DT> (v)
{
_currSize = v._currSize;
_incFactor = v.incFactor();
}
template <class DT>
Vector<DT>::Vector (const ArrayClass<DT>& ac)
: ArrayClass<DT> (ac)
{
_currSize = ac.size();
_incFactor = (_currSize+1)/2;
}
template <class DT>
void Vector<DT>::operator= (const Vector<DT>& v)
{
ArrayClass<DT>::copy (v);
_currSize = v._currSize;
_incFactor = v.incFactor();
}
//template <class DT>
//void Vector<DT>::operator= (const ArrayClass<DT>&ac)
//{
// ArrayClass<DT>::copy (ac);
// _currSize = ac.size();
// _incFactor = (_currSize+1)/2;
//}
template <class DT>
int Vector<DT>::size() const
{
return _currSize;
}
template <class DT>
int Vector<DT>::capacity() const
{
return _size;
}
template <class DT>
int Vector<DT>::incFactor() const
{
return _incFactor;
}
template <class DT>
void Vector<DT>::add (const DT& item)
{
insert (item, _currSize);
}
template <class DT>
void Vector<DT>::setIncFactor(int f)
{
if (f >= 0) _incFactor = f;
}
template <class DT>
void Vector<DT>::setCapacity(int c)
{
int len = _currSize;
if (len > c) len = c;
DT* paNew = new DT[c];
if (paNew == NULL)
{
throw ArrayMemoryException();
}
for (int i = 0; i < len; i++)
{
paNew[i] = paObject[i];
}
if (paObject != NULL)
{
delete[] paObject;
}
paObject = paNew;
_size = c;
if (_currSize > len)
{
_currSize = len;
}
}
template <class DT>
void Vector<DT>::insert (const DT& item, int index)
{
if ((index < 0) || (index > _currSize))
{
throw ArrayBoundsException();
}
if (_currSize+1 == _size)
{
setCapacity (_size + _incFactor);
}
_currSize++;
for (int i = _currSize-1; i > index; i--)
{
(*this)[i] = (*this)[i-1];
}
(*this)[index] = item;
}
template <class DT>
void Vector<DT>::remove (int index)
{
if ((index < 0) || (index >= _currSize))
{
throw ArrayBoundsException();
}
if (_currSize <= _size-_incFactor)
{
setCapacity (_size - _incFactor);
}
for (int i = index; i < _currSize-1; i++)
{
(*this)[i] = (*this)[i+1];
}
_currSize--;
}
答案 0 :(得分:4)
在编译代码时,在实例化模板的位置,即在代码中
Vector<AccountInfo*> _accounts;
编译器将使用模板Vector
生成一个新类(使用给定的模板参数,即AccountInfo*
)。因此,编译器此时需要访问模板Vector<T>
的实现。
因此,这意味着,模板Vector<T>
应该完全在头文件中实现。
如果你想确保模板定义和实现之间的分离,那么
您可以有两个头文件,一个Vector.h
和其他Vector_impl.h
,其中Vector_impl.h
包含模板的实现。
在Vector.h
中加入Vector_impl.h
并在您要实例化模板的.cpp文件中包含Vector_impl.h
,Vector < AccountInfo*>.
答案 1 :(得分:2)
这些错误在这里,因为链接阶段(在编译阶段之后发生)无法找到Vector的构造函数和析构函数的二进制代码以及ArrayClass的析构函数。
我的猜测是你忘了在模板类中定义那些函数,但是你声明了它们。它之前编译,因为你没有实际实例化该类的对象(我的猜测)。简单的解决方案(假设我的猜测是正确的)是将方法定义放在与声明相同的文件中(即Vector.h)。你能展示一下“Vector.h”中的内容吗?
最后一句话:“private”关键字在这里没用,默认情况下,class是私有的。
修改强>:
为了扩展我的评论,您的代码实际上缺少Vector::~Vector
的定义。 Java没有抱怨它,因为析构函数不存在:)