如何从链表 return 指针(在 Class 模板中)
How to return pointer from linked list (in Class Template)
我偶然发现我的链表有问题 class。
我有一个抽象 class Shape
和多个 class 继承自它,例如 Square
或 Triangle
等
我将它们存储在我的 List
class 中,但我不知道如何 return 将存储的对象返回到 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
}
正如您所看到的,我在 return 从我的列表中输入正确的值时遇到了问题,我不知道如何解决这个问题。
这是我的简化列表实现:
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;
}
}
}
提前感谢您就如何完成这项工作提出任何建议。
@编辑
啊,我忘了添加我得到的编译器错误:
Error 1 error C2440: '=' : cannot convert from 'Shape **' to 'Shape *'
是否要在列表中存储形状或指向形状的指针?并且您希望 findInstanceAt return 列表中的节点还是指向列表中节点的指针?目前你在这些事情上并不一致
您将 Shape* 节点存储在列表中,但 findInstanceAt return 是指向节点的指针 - 这是一个 Shape** 对象。这就是编译器所抱怨的
您可能需要更改
T* findInstanceAt(int _k)
至
T findInstanceAt(int _k)
我偶然发现我的链表有问题 class。
我有一个抽象 class Shape
和多个 class 继承自它,例如 Square
或 Triangle
等
我将它们存储在我的 List
class 中,但我不知道如何 return 将存储的对象返回到 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
}
正如您所看到的,我在 return 从我的列表中输入正确的值时遇到了问题,我不知道如何解决这个问题。
这是我的简化列表实现:
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;
}
}
}
提前感谢您就如何完成这项工作提出任何建议。
@编辑
啊,我忘了添加我得到的编译器错误:
Error 1 error C2440: '=' : cannot convert from 'Shape **' to 'Shape *'
是否要在列表中存储形状或指向形状的指针?并且您希望 findInstanceAt return 列表中的节点还是指向列表中节点的指针?目前你在这些事情上并不一致
您将 Shape* 节点存储在列表中,但 findInstanceAt return 是指向节点的指针 - 这是一个 Shape** 对象。这就是编译器所抱怨的
您可能需要更改
T* findInstanceAt(int _k)
至
T findInstanceAt(int _k)