我正在尝试实施类似“facebook”的问题。
我创建了一个名为User
的类。用户有一个朋友列表。
我尝试使用C ++向量,但它没有任何问题。
然后我尝试使用我拥有的模板类将矢量更改为LinkedList
。
模板有一个复制构造函数和析构函数。
我已经测试并调试了其他数据类型的模板。
class User
{
private:
string uname;
//vector<User> myfriends;
LinkedList<User> myfriends;
public:
User() { uname = "none"; }
User(string n) { uname = n; }
string getName() { return uname; }
void addFriend(User &u)
{
//add u to me
myfriends.appendNode(u);
//add "me" to u
u.myfriends.appendNode(*this); //causes problem?
//myfriends.push_back(u); //when using vector
//u.myfriends.push_back(*this); //works when using vector
}
void listFriends()
{
cout << uname << " has " << myfriends.getSize() << " friends" << endl;
myfriends.displayList(); //prints values in linked list
}
friend ostream& operator<< (ostream& out, User u)
{
out << u.uname;
return out;
}
};
我希望addFriend函数能够建立“相互”的连接。
当我使用vector
但使用此LinkedList
和此测试程序时,此方法有效:
User u1("joe");
User u2("sam");
u1.addFriend(u2);
u1.listFriends();
我得到正确的输出
joe has 1 friends
sam
但是我也遇到一个运行时错误,它告诉我一些问题正在发生在我的指针上。
“问题导致程序无法正常工作。”
我正在使用Visual Studio Express 2017。
我试图弄清楚是否存在一些以这种方式建立连接的基本缺陷,试图绘制一些图片来解决它。
有关可能导致运行时错误的原因的任何想法?
这是displayList()
函数:
template <class T>
void LinkedList<T>::displayList()
{
//"walk" the list and print each value
ListNode *nodePtr;
//to walk the list
//start at the beginning
nodePtr = head;
//while there is a node to print
while (nodePtr) {
//display the value
cout << nodePtr->data << endl;
//move to next node
nodePtr = nodePtr->next;
}
}
这是LinkedList模板中的displayList代码
template <class T>
void LinkedList<T>::displayList()
{
//"walk" the list and print each value
ListNode *nodePtr; //to walk the list
//start at the beginning
nodePtr = head;
//while there is a node to print
while (nodePtr)
{
//display the value
cout << nodePtr->data << endl;
//move to next node
nodePtr = nodePtr->next;
}
}
这是appendNode
template <class T>
void LinkedList<T>::appendNode(T value)
{
ListNode *newNode; //to point to a new node
ListNode *nodePtr; //to move through the list
//allicate a new node and store value
newNode = new ListNode;
newNode->data = value;
newNode->next = nullptr;
//if list is empty make this the first node
if (!head)
head = newNode;
else // insert at end of list
{
//initialize nodePtr to head of list
nodePtr = head;
//"walk" the listt to find the last node
while (nodePtr->next) //if not null this is true
{
nodePtr = nodePtr->next;
}
//nodePtr now points to last node in list
//add the new node
nodePtr->next = newNode;
//remember it's next has already been assigned to null
}
numElements++;
}
答案 0 :(得分:1)
你有
LinkedList<User> myfriends;
当你这样做时
void addFriend(User &u)
{
//...
}
您将完成User的完整副本,包括其中的LinkedList对象。 但是,在您的LinkedList中,您没有指定赋值运算符,这意味着您传入的用户的头部将被直接分配,从而为您留下2个具有相同头部的LinkedList。
因此,相同的头指针将被释放两次。