链接器错误 2005 似乎是由构造函数引起的

linker error 2005 seemingly caused by a constructor

我一直收到以下链接器错误

而且好像是下面的构造函数造成的

/*Card.h*/
#ifndef Card_H
#define Card_H

#pragma once
#include <iostream>
using namespace std;
#include <cassert> //for assert()
#include <string>
#include <time.h>

using namespace std;

/*Card.h*/
enum color { club, diamond, heart, spade };

class Card {
public:
    Card(color c = club, int v = 1);//this line

private:
    color col;
    int val;
};

/*Constructor*/
Card::Card(color c, int v) {// and this too
    col = c;
    val = v;
}

#endif

我很困惑,播放器或 myFile 都不能重新定义卡片,因为它们甚至不包含 Card.h 文件。

构造函数的实现应该放在一个名为 Card.cpp

的文件中

Card.h

#ifndef Card_H
#define Card_H

#include <iostream>
#include <cassert>
#include <string>
#include <time.h>

using namespace std;

enum color { club, diamond, heart, spade };

class Card {
public:
    Card(color c = club, int v = 1);

private:
    color col;
    int val;
};

#endif

Card.cpp

#include "Card.h"

Card::Card(color c, int v) {
    col = c;
    val = v;
}

在您的 header 文件中:

Card::Card(color c, int v) {

这是Card构造函数的定义。这意味着每个翻译单元(一个 C++ 源文件),#includes 这个 header 最终定义了这个构造函数。请记住,header 文件的 #include 完全等同于逻辑上插入 header 文件的内容, verbatim,进入#include的C++源文件。

如果您有十个 C++ 源文件包含此 header 这意味着这十个 C++ 源文件中的每一个都定义了此构造函数。

这违反了 C++ 的 One Definition Rule,它要求每个 (non-inlined) object 或函数只定义一次。不多也不少

这解释了你的编译错误。您只需将此构造函数的定义移动到恰好 一个 的 C++ 源文件中。