我正在写一个简单的类并得到一些错误。头文件如下所示:
//
// temp.h
//
#ifndef _TEMP_h
#define _TEMP_h
#include <string>
using namespace std;
class GameEntry {
public:
GameEntry(const string &n="", int s=0);
string getName();
int getScore();
private:
string name;
int score;
};
#endif
方法文件如下所示:
// temp.cpp
#include "temp.h"
#include <string>
using namespace std;
GameEntry::GameEntry(const string &n, int s):name(n),score(s) {}
string GameEntry::getName() { return name; }
int GameEntry::getScore() { return score; }
主文件如下所示:
#include <iostream>
#include <string>
#include "temp.h"
using namespace std;
int main() {
string str1 = "Kenny";
int k = 10;
GameEntry G1(str1,k);
return 0;
}
我得到这样的错误:
Undefined symbols for architecture x86_64:
"GameEntry::GameEntry(std::__1::basic_string<char, std::__1::char_traits<char>,
std::__1::allocator<char> > const&, int)", referenced from:
_main in main1-272965.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
谁能告诉我什么错了?非常感谢。
答案 0 :(得分:2)
您不能将默认参数放在定义中:
GameEntry::GameEntry(const string &n, int s):name(n),score(s) {}
编辑:实际上你可以把它放在定义中,但你不能把它放在定义和声明中。可在此问题中找到更多信息:Where to put default parameter value in C++?
答案 1 :(得分:1)
您不能在.h和.cpp文件中都有默认值。
将头文件中的原型更改为:
GameEntry(const string &n, int s);
你很高兴。
在main.cpp中,您错过了分号:int k = 10
一个有趣的链接:Where to put default parameter value in C++?
长话短说,这取决于你。
如果它在头文件中,它有助于文档,如果它在源文件中,它实际上帮助读取代码的读者并且不会使用它。
答案 2 :(得分:1)
除了纠正默认参数的问题之外,正如clcto和G. Samaras所指出的,您需要将temp.cpp
编译为目标文件(temp.o
)并将其与{{{ 1}}。试试这个:
main.cpp
g++ -c temp.cpp
。
缺少的符号可以在目标文件中找到,如果您没有明确编译g++ main.cpp temp.o
,则无法创建。我想你可能错误地记得过去的作品。