编译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的符号

编译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(

我不明白为什么会发生这种情况,我试图通过编译单独的.h和.cpp文件以及将类和主函数放在同一个.cpp文件中来运行它。任何帮助都将不胜感激。这是我的代码

#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: