通过引用错误的 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
,则不会创建该文件。我想你可能记错了过去的工作。
我正在写一个简单的 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
,则不会创建该文件。我想你可能记错了过去的工作。