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

passing string by reference wrong c++

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

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

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

您不能将默认参数放在定义中:

GameEntry::GameEntry(const string &n, int s):name(n),score(s) {}

编辑:其实你可以把它放在定义中,但你不能把它同时放在定义和声明中。可以在这个问题中找到更多信息:Where to put default parameter value in C++?

.h 和 .cpp 文件中不能有默认值。

将头文件中的原型改为:

GameEntry(const string &n, int s);

你很高兴。

在 main.cpp 中,您在这里漏掉了一个分号:int k = 10


一个有趣的link:Where to put default parameter value in C++?

长话短说,由你决定。

如果它在头文件中,它有助于文档,如果它在源文件中,它实际上有助于 reader 阅读代码而不只是使用它。

除了纠正默认参数的问题,如 clcto 和 G. Samaras 所指出的,您还需要将 temp.cpp 编译为目标文件 (temp.o) 和 link 它与 main.cpp。试试这个:

g++ -c temp.cpp

g++ main.cpp temp.o

丢失的符号在目标文件中找到,如果您不明确编译 temp.cpp,则不会创建该文件。我想你可能记错了过去的工作。