我偶然发现我的链表类有问题
我有一个抽象类Shape
和从中继承的多个类,如Square
或Triangle
等。
我将它们存储在我的List
类中,但我不知道如何将存储的对象返回到Shape
的指针。
由于我的解释看起来很模糊,所以解释了一些具有预期行为的代码。
class Shape // abstract class
{
public:
int a;
//some member virtual methods
};
class Square : public Shape
{
//using the virtual methods from Shape
};
在我的主文件中,这就是我想要使用它的方式:
int main()
{
List<Shape*> ShapeList;
Shape *ptr;
Square a(2, 1, 1); // size, x, y coordinates
ShapeList.add(ptr);
//up to this point everything works well
// now I want my list to return a pointer to it's member
// so I can modify it
Shape *listptr;
listptr = ShapeList.findInstanceAt(0); // here's my error
listptr->a = 5; // what I want to do next
}
因为你可以看到我从列表中返回正确的值并且我不知道如何解决这个问题。
这是我的简化列表实现:
template <class T> class Node
{
T data;
Node *next;
public:
inline T getData()
{
return data;
}
inline Node* getNext()
{
return next;
}
};
template <class T> class List
{
Node<T> *head, *tail;
public:
List() : head(NULL), tail(NULL) { }
T* findInstanceAt(int _k)
{
if (NULL == head)
{
cout << "\nList is empty.";
return NULL;
}
else
{
Node<T> *temp = new Node<T>;
temp = head;
for (size_t k = 0; k < _k; ++k)
{
if (NULL != temp->getNext()) temp = temp->getNext();
else return NULL;
}
return temp->getData;
}
}
}
提前感谢您提供有关如何开展此项工作的任何建议。
@EDIT
啊,我忘了添加我得到的编译器错误:
Error 1 error C2440: '=' : cannot convert from 'Shape **' to 'Shape *'
答案 0 :(得分:1)
是否要将形状或指针存储到列表中的形状?您是否希望findInstanceAt返回列表中的节点或指向列表中节点的指针?目前你对这些事情并不一致
您在列表中存储Shape *节点,但findInstanceAt返回指向节点的指针 - 这是一个Shape **对象。这就是编译器抱怨的内容
你可能需要改变
T* findInstanceAt(int _k)
到
T findInstanceAt(int _k)