首页 文章

visual studio Linker Error

提问于
浏览
0

我正在写一个简单的Queue类(用于练习) . 该项目由Queue Class使用的简单整数Node Class和它自己的Queue类组成 .

在构建期间,我在我的c项目中遇到3个不同的链接器错误,如下所示:

  • 错误LNK2005“public:__thiscall Node :: Node(int)”(?? 0Node @@ QAE @ H @ Z)已在fmQueue.obj队列中定义

  • 错误LNK2005“public:__thiscall Node :: Node(void)”(?? 0Node @@ QAE @ XZ)已在fmQueue.obj队列中定义

  • 错误LNK1169找到一个或多个多重定义的符号队列

我确实看过我在哪里介绍我的课程,但是我不明白这个来自哪里 .

我的代码:

Node.h:

// Node.h
// 1-way linked node for use in simple integer Queue

#ifndef NODE_H
#define NODE_H

class Node
{
public:
    Node();
    Node(int);

    int data;
    Node *next;
};

Node::Node()
{
    data = -1;
    next = nullptr;
}

Node::Node(int x)
{
    data = x;
    next = nullptr;
}

#endif

fmQueue.h:

#ifndef _FMQUEUE_H
#define _FMQUEUE_H


#include <iostream>
#include "Node.h"

namespace fm
{
    class fmQueue
    {
        Node *_head, *_tail;
        void clearbuf();


    public:

        fmQueue();

        ~fmQueue();

        void deQueue(); // uses front to access data, or remove data
        void enQueue(int); // uses back to sort data, or add data
        void dumQueue();

        //int peek(); // get a copy of the front data without removing it

        bool isEmpty();

    };

}

#endif /* _FMQUEUE_H */

fmQueue.cpp:

#include "fmQueue.h"

using namespace fm;

//---------Private Methods--------
void fmQueue::clearbuf()
{
    _head = _tail = nullptr;
}

//--------Public Methods----------

fmQueue::fmQueue()
{
    clearbuf();
}

fmQueue::~fmQueue()
{
    clearbuf();
}

bool fmQueue::isEmpty()
{
    if (_head == _tail && _head == nullptr)
        return false;
    else
        return true;
}


void fmQueue::enQueue(int data1)
{
    Node *tempNode = new Node;

    tempNode->next = nullptr;
    tempNode->data = data1;

    if (_head == nullptr)
    {
        _head = tempNode;
        _tail = tempNode;
    }


    else
    {
        _tail->next = tempNode;
    }

    _tail = tempNode;
}

void fmQueue::deQueue()
{
    Node *tempNode = new Node;

    if (_head == nullptr)
        std::printf("NOOOOP, THE QUEUE IS EMPTY");

    else
    {
        tempNode = _head;

        _head = _head->next;
        std::cout << "the data dequeued is: " << tempNode->data; //add a print statment to see which node was deleted

        delete tempNode;


    }

}

void fmQueue::dumQueue()
{
    Node *tempNode = new Node;

    if (tempNode)
        while (tempNode->next != nullptr)
        {
            std::cout << "Queue :" << tempNode->data;

            tempNode = tempNode->next;
        }
    else
        std::cout << "Nothing to show";

}

main.cpp中:

#include"fmQueue.h"

int main()
{
    fm::fmQueue my_queue;
    my_queue.enQueue(2);
    std::cout << "fiirst done" << std::endl;
    my_queue.enQueue(4);
    std::cout << "second done" <<std::endl;
    my_queue.dumQueue();
    std::cout << "show done" << std::endl;
    my_queue.deQueue();
    std::cout << "delete done" << std::endl;
    my_queue.dumQueue();
    std::cout << "show done" << std::endl;
    my_queue.deQueue();
    std::cout << "delete done" << std::endl;

    return 0;
}

2 回答

  • 0

    它是由头文件中的实现引起的 .
    会发生什么是你的fmQueue.cpp编译单元编译,并定义构造函数 . 之后,main.cp编译并定义相同的函数(因为它们在包含的头文件中可见) .
    因此,当链接器尝试将2个编译单元链接在一起时,它会检测到双重定义 .

    所以,这就是你应该在.cpp文件中实现函数的原因 .
    另一种解决方案是解耦头依赖性 . 您可以在队列's header, and only actually include the header in the queue' s cpp文件中转发声明Node类 .

  • 1

    而不是将#include“node.h”放在其他 Headers 中,而是将其放在.cpp中 .

    然后你必须在fmQueue.h中转发声明类型 .

    // fmQueue.h
    
    class Node;
    
    namespace fm
    {
    class fmQueue
    {
        Node *_head, *_tail;
        void clearbuf();
    
     .....
    
    // fmQueue.cpp
    
    
     #include "fmQueue.h"
     #include "Node.h"
     ....
    

    编译器只需要知道此时将存在类型“类节点”,它不需要知道Node的任何成员或方法 .

相关问题