链接器错误 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++ 源文件),#include
s 这个 header 最终定义了这个构造函数。请记住,header 文件的 #include
完全等同于逻辑上插入 header 文件的内容, verbatim,进入#include
的C++源文件。
如果您有十个 C++ 源文件包含此 header 这意味着这十个 C++ 源文件中的每一个都定义了此构造函数。
这违反了 C++ 的 One Definition Rule,它要求每个 (non-inlined) object 或函数只定义一次。不多也不少
这解释了你的编译错误。您只需将此构造函数的定义移动到恰好 一个 的 C++ 源文件中。
我一直收到以下链接器错误
而且好像是下面的构造函数造成的
/*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++ 源文件),#include
s 这个 header 最终定义了这个构造函数。请记住,header 文件的 #include
完全等同于逻辑上插入 header 文件的内容, verbatim,进入#include
的C++源文件。
如果您有十个 C++ 源文件包含此 header 这意味着这十个 C++ 源文件中的每一个都定义了此构造函数。
这违反了 C++ 的 One Definition Rule,它要求每个 (non-inlined) object 或函数只定义一次。不多也不少
这解释了你的编译错误。您只需将此构造函数的定义移动到恰好 一个 的 C++ 源文件中。