0

我最近一直在尝试学习自己使用 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,因为您拥有更多经验的编码向导应该有更好的眼光来发现(我至少认为是)新手错误。

4

0 回答 0