编译g++; P> >类,我们正在学习C++中的OOP,我构建了我的类,但是每次我尝试编译它时,我得到这个错误信息: Undefined symbols for architecture x86_64: "Player::set_assits(int)", referenced from: _main in playerDataBase-666bbb.o "Player::set_last_name(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)", referenced from: _main in playerDataBase-666bbb.o "Player::set_team_name(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)", referenced from: _main in playerDataBase-666bbb.o "Player::set_first_name(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)", referenced from: _main in playerDataBase-666bbb.o "Player::set_year_of_birth(int)", referenced from: _main in playerDataBase-666bbb.o "Player::set_goals(int)", referenced from: _main in playerDataBase-666bbb.o "Player::Player()", referenced from: _main in playerDataBase-666bbb.o "Player::~Player()", referenced from: _main in playerDataBase-666bbb.o ld: symbol(s) not found for architecture x86_64 架构x86_64的未定义符号: “Player::set_assits(int)”,引用自: _playerDataBase-666BB.o中的主数据 “Player::set_last_name(std::_1::basic_string)”,引用自: _playerDataBase-666BB.o中的主数据 “玩家::设置团队名称(标准::uuuu 1::基本字符串)”,引用自: _playerDataBase-666BB.o中的主数据 “播放器::设置首字母名称(std::uuu 1::基本字符串)”,引用自: _playerDataBase-666BB.o中的主数据 “玩家::设置出生年份(整数)”,引用自: _playerDataBase-666BB.o中的主数据 “玩家:设定目标(int)”,引用自: _playerDataBase-666BB.o中的主数据 “Player::Player()”,引用自: _playerDataBase-666BB.o中的主数据 “Player::~Player()”,引用自: _playerDataBase-666BB.o中的主数据 ld:找不到架构x86_64的符号
我不明白为什么会发生这种情况,我试图通过编译单独的.h和.cpp文件以及将类和主函数放在同一个.cpp文件中来运行它。任何帮助都将不胜感激。这是我的代码编译g++; P> >类,我们正在学习C++中的OOP,我构建了我的类,但是每次我尝试编译它时,我得到这个错误信息: Undefined symbols for architecture x86_64: "Player::set_assits(int)", referenced from: _main in playerDataBase-666bbb.o "Player::set_last_name(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)", referenced from: _main in playerDataBase-666bbb.o "Player::set_team_name(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)", referenced from: _main in playerDataBase-666bbb.o "Player::set_first_name(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)", referenced from: _main in playerDataBase-666bbb.o "Player::set_year_of_birth(int)", referenced from: _main in playerDataBase-666bbb.o "Player::set_goals(int)", referenced from: _main in playerDataBase-666bbb.o "Player::Player()", referenced from: _main in playerDataBase-666bbb.o "Player::~Player()", referenced from: _main in playerDataBase-666bbb.o ld: symbol(s) not found for architecture x86_64 架构x86_64的未定义符号: “Player::set_assits(int)”,引用自: _playerDataBase-666BB.o中的主数据 “Player::set_last_name(std::_1::basic_string)”,引用自: _playerDataBase-666BB.o中的主数据 “玩家::设置团队名称(标准::uuuu 1::基本字符串)”,引用自: _playerDataBase-666BB.o中的主数据 “播放器::设置首字母名称(std::uuu 1::基本字符串)”,引用自: _playerDataBase-666BB.o中的主数据 “玩家::设置出生年份(整数)”,引用自: _playerDataBase-666BB.o中的主数据 “玩家:设定目标(int)”,引用自: _playerDataBase-666BB.o中的主数据 “Player::Player()”,引用自: _playerDataBase-666BB.o中的主数据 “Player::~Player()”,引用自: _playerDataBase-666BB.o中的主数据 ld:找不到架构x86_64的符号,c++,C++,我不明白为什么会发生这种情况,我试图通过编译单独的.h和.cpp文件以及将类和主函数放在同一个.cpp文件中来运行它。任何帮助都将不胜感激。这是我的代码 #include <iostream> #include <string> using namespace std; class Player{ public: Player(); ~Player(); // accessors and mutators void set_first_name(
#include <iostream>
#include <string>
using namespace std;
class Player{
public:
Player();
~Player();
// accessors and mutators
void set_first_name(string in_first_name);
string first_name();
void set_last_name(string in_last_name);
string last_name();
void set_team_name(string in_team_name);
string team_name();
void set_year_of_birth(int in_year_of_birth);
int year_of_birth;
void set_goals(int in_goals);
int goals;
void set_assits(int in_assists);
int assists;
//methods
void display();
private:
string first_name_;
string last_name_;
string team_name_;
int year_of_birth_;
int goals_;
int assits_;
};
void Player::display(){
cout << first_name_ << last_name_ << endl;
}
int main(){
Player player;
player.set_first_name("John");
player.set_last_name("Tedesco");
player.set_team_name("Blyth Warriors");
player.set_year_of_birth(2002);
player.set_goals(2);
player.set_assits(7);
player.display();
}
#包括
#包括
使用名称空间std;
职业选手{
公众:
Player();
~Player();
//存取器和变异器
void set_first_name(_first_name中的字符串);
字符串first_name();
void set_last_name(_last_name中的字符串);
字符串last_name();
无效设置团队名称(团队名称中的字符串);
字符串team_name();
无效设置出生年份(出生年份整数);
出生年份;
无效设置目标(目标中的整数);
int目标;
无效集合辅助(整数辅助);
国际助攻;
//方法
void display();
私人:
第一个字符串\u名称\u;
字符串last\u name\u;
字符串团队名称;
出生年份;
国际目标;
国际助理;
};
void Player::display(){
cout这些方法均未定义,仅声明:
Player();
~Player();
// accessors and mutators
void set_first_name(string in_first_name);
string first_name();
void set_last_name(string in_last_name);
string last_name();
void set_team_name(string in_team_name);
string team_name();
void set_year_of_birth(int in_year_of_birth);
void set_goals(int in_goals);
void set_assits(int in_assists);
您需要为这些方法提供合理的定义。现在,您告诉编译器您将为这些方法中的每一个提供一个定义,并且永远不会这样做。对于默认构造函数,如果希望编译器生成构造函数,您可以使用Player()=default;
例如,要定义first_name
属性,可以执行以下操作:
void Player::set_first_name(const string& in_first_name)
{
first_name_ = in_first_name;
}
const string& first_name() const
{
return first_name_;
}
请注意,出于效率原因,我已将此更改为按常量引用获取值,并按常量引用而不是按值返回值。您声明了所有这些奇特的方法,例如:
void set_first_name(string in_first_name);
string first_name();
但您从未定义过它们!
实施它们,它就会起作用,例如:
void set_first_name(string in_first_name) {
first_name_ = in_first_name;
}
string first_name() {
return first_name_;
}
你必须实现所有的方法。你在C中想:C++没有为你实现访问器和调制器。你必须自己做。谢谢,我真的被卡住了,但是现在我明白了。谢谢你的帮助,也很快的问题,因为我对指针不太熟悉。参考或not@JohnTedesco通过值传递时,复制类的全部内容。通过指针传递时,有效地传递一个“指向”的整数到内存中的地址。对于小型数据类型,如int
或float
,按值传递实际上比按引用传递更有效。但是,按引用传递可以避免复制并允许您修改该引用的内容。在上述情况下,std::string
是一个相当大的对象,必须在您的属性中复制。通过const引用传递,或者当您对C++更熟悉,通过移动时,更好。@ JordeDeSo这里是移动语义的快速入门,FYI: