我读到“如果在头文件(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
中定义”)。
答案 0 :(得分:1)
#include<List.cpp>
中有一个Matrice.cpp
,并且在将所有cpp文件编译和链接在一起时,这将导致List.cpp
中定义的所有内容的重复定义,因为它们在{{ 1}}由于包含。
将Matrice.cpp
替换为#include<List.cpp>
,并将#include<List.h>
的声明添加到empty