我最近一直在尝试学习自己使用 QT,作为练习的一部分,我设置了一些简单的东西来管理一副纸牌(通过拖放和其他类似的简单东西添加和删除纸牌)。但是,正如您可能想象的那样,它并不像我希望的那样顺利。为了实现这个逻辑,我使用了 3 个类,Card、Node 和 Pile,它们都有自己的标头以及可以用它们做什么的原型。
这里的问题是,当我尝试编译它们时,编译器开始抱怨目标文件中有关不同类的功能的重复符号。如果我用“/* */”注释掉一个,问题只会将一个函数“向下”移动,而编译器唯一不会抱怨的是析构函数。每当我尝试编译时,它会更具体地说明:
duplicate symbol Node::Node(*Card) in Node.o and Node.o
这是 (.hpp) 标头的样子:
#ifndef NODE_HPP
#define NODE_HPP
#include "Card.hpp"
class Node{
Node *next;
Card *c;
public:
Node() { }
Node(Card *newCard);
~Node();
Node *getNext();
void appendNode(Card *newCard);
void printCard();
void setNext(Node *nextNode);
Card *getCard(); //Returns card in node (with removal)
Card *peekCard(); //Returns card in node (without removal)
};
#endif //NODE_HPP
...这就是实际的 .cpp 文件的样子:
#include "Node.hpp"
#include "Card.hpp"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
Node::Node(Card *newCard){
c = newCard;
next = NULL;
}
Node::~Node(){
free(c);
delete this;
}
Node* Node::getNext(){
return next;
}
void Node::appendNode(Card *newCard){
if(next == NULL){
next = new Node(newCard);
}
else{
Node* NodePointer = next;
while((NodePointer->getNext()) != NULL){
NodePointer = NodePointer->getNext();
}
NodePointer->next = new Node(newCard);
}
}
void Node::printCard(){
c->printCard();
}
void Node::setNext(Node *nextNode){
next = nextNode;
}
Card* Node::getCard(){
return c;
c = NULL;
}
Card* Node::peekCard(){
return c;
}
所以我现在基本上不知道可能出了什么问题,因为我已经尝试了我能想到的一切,并且在我看来,代码应该没问题,因为无论我多么努力地看,我都看不到任何东西错了。因此,由于谷歌搜索和在许多其他网站上的搜索都没有结果,我现在转向 stackoverflow,因为您拥有更多经验的编码向导应该有更好的眼光来发现(我至少认为是)新手错误。