通过引用错误的c ++传递字符串

时间:2015-01-09 22:22:26

标签: c++ string class reference

我正在写一个简单的类并得到一些错误。头文件如下所示:

//
//  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)

谁能告诉我什么错了?非常感谢。

3 个答案:

答案 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,则无法创建。我想你可能错误地记得过去的作品。