虽然我确定这是一个常见问题,但我一直没能找到关于此的讨论帖。我找到的最接近的是 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/