c++ - 是否可以在全局函数中访问类成员?

标签 c++

虽然我确定这是一个常见问题,但我一直没能找到关于此的讨论帖。我找到的最接近的是 here , 但它最终似乎并没有问同样的事情。

我是 C++ 的新手,所以我可能只是在做一些愚蠢的事情。

假设我有以下 Person 类设置(抱歉所有代码。我不确定问题到底出在哪里——如果这可能的话——所以我包括了所有内容。):

person.h

#ifndef PERSON_H
#define PERSON_H

#include <string>
using std::string;

class Person {
public:
  Person();
  Person(string name);
  ~Person();

  string name;

private:
};

#endif

person.cpp

#include "person.h"

Person::Person() {
}

Person::Person(string name) {
  this->name = name;
}

Person::~Person() {
}

然后我想要一个全局函数来更改给定人的 name 属性:

globals.h

#ifndef GLOBALS_H
#define GLOBALS_H

#include <string>
using std::string;

class Person; // forward declaring

void changeName(Person* person, string name);

#endif

全局变量.cpp

#include "globals.h"

void changeName(Person* &person, string name) {
  person->name = name;
}

当我尝试编译时,出现“类不完整”和“前向声明”错误(如有必要,我可以提供)。我是在做错什么,还是必须使用类成员函数(例如 Person::changeName(.....))来执行此操作?

谢谢你的帮助。

最佳答案

您的 globals.cpp 文件缺少必要的 #include "person.h"


还有一些其他问题:

void changeName(Person* person, string name);

这大概应该是:

void changeName(Person& person, string name);

除非您希望使用nullptr 调用该函数。

void changeName(Person* &person, string name) {
  person->name = name;
}

应该是:

void changeName(Person& person, string name) {
  person.name = name;
}

然后是这个:

Person::Person(string name) {
  this->name = name;
}

您应该改用初始化列表:

Person::Person(string name) : name(name) {}

而且我不确定您是否知道通过 const& 传递 std::string 的可能性。它曾经是传递字符串的指南,直到 C++11 出现并引发了关于传递大对象最佳实践的持续讨论。

关于c++ - 是否可以在全局函数中访问类成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33437753/

相关文章:

python - 如何使用 boost_python 将 C++ 序列化数据暴露给 python

c++ - 模板模板类中非类型参数的类型在 C++14 中不可推导,但在 C++17 中可推导

c++ - C++ 中带有纯虚方法的抽象模板类

c++ - Inflate HTML gZIP 内容时出现错误 `invalid distance too far back`

c++ - 仅在 C/C++ 中使用 header 时?

c++析构函数破坏的对象多于构造函数创建的对象

c++ - 在 C++ 中手动模拟 delete 运算符的效果是否正式非法?

c++ - ffmpeg和代码生成的碎片化mp4文件的区别

c++ - 这是否被视为 C/C++ 中的未定义行为?

c++ - 具有增加的所有者线程优先级的同步原语