时间:2019-07-23 15:52:34

标签: c++ lnk2005

我读到“如果在头文件(Header.h)中声明并实现一个函数,并且该文件被两次包含,那么您很可能会在某个时刻得到一个已经定义的错误”。但是在我的代码中,我遇到错误的所有功能都在.cpp文件中。

List.h

#pragma once

typedef struct list
{

    int lin;
    int col;
    int val;

    struct list* next;
    struct list* prev;

}list;

List.cpp

#include "List.h"

bool empty(list*& start)
{
    return (start == nullptr);
}

Matrice.h

#pragma once

#include "List.h"   

class Matrice
{
private:

    list* start;
    list* finish;

public:

    Matrice() :start(nullptr), finish(nullptr) {}
    Matrice(const Matrice& matrice);

};

Matrice.cpp

#include "Matrice.h"
#include "List.cpp"

Matrice::Matrice(const Matrice& matrice)
{
    if (empty(start))
    {
        // Code
    }
}

Source.cpp

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

int main()
{
    Matrice a;
    Matrice b;
    a = b;
}

我添加了所有文件,也许有些东西看不到。错误是在bool empty(list*& start)函数上引起的(“已经在List.obj中定义”)。

1 个答案:

答案 0 :(得分:1)

#include<List.cpp>中有一个Matrice.cpp,并且在将所有cpp文件编译和链接在一起时,这将导致List.cpp中定义的所有内容的重复定义,因为它们在{{ 1}}由于包含。

Matrice.cpp替换为#include<List.cpp>,并将#include<List.h>的声明添加到empty