私は最近、QT の使い方を学ぼうとしていて、演習の一環として、カードのデッキを管理するための簡単なものをいくつかセットアップしました (ドラッグ アンド ドロップによるカードの追加と削除などの簡単なこと)。しかし、ご想像のとおり、私が望んでいたほどスムーズには進んでいません。このロジックを実装するために、Card、Node、および Pile の 3 つのクラスを使用しました。これらのクラスにはすべて、独自のヘッダーがあり、それらで何ができるかについてのプロトタイプが含まれています。
ここでの問題は、それらをコンパイルしようとすると、コンパイラがオブジェクト ファイル内の異なるクラスの関数に関する重複シンボルについて不平を言い始めることです。「/* */」でコメントを外すと、問題は1つの関数だけを「下に」移動し、コンパイラが文句を言わないのはデストラクタだけです。コンパイルしようとするたびに、より具体的には次のように表示されます。
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;
}
したがって、考えられるすべてのことを試したので、本質的に何が間違っているのかについての考えがなくなりました。私の意見では、どんなに一生懸命見ても何も見えないので、コードは問題ないはずです。それは間違っています。Google の検索や他の多くのサイトでの検索では何も結果が得られなかったので、スタックオーバーフローに目を向けています。より多くの経験を積んだウィザードをコーディングすると、見分ける目がよくなるはずです (少なくとも私が考えていることは) 初心者です。間違い。