是否可以访问全局函数中的类成员?

时间:2015-10-30 13:57:50

标签: 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

globals.cpp

#include "globals.h"

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

当我尝试编译时,我得到“不完整的类”和“前向声明”错误(如果需要我可以提供)。我做错了什么,或者我是否必须使用类成员函数(例如Person::changeName(.....))来做这件事?

感谢您的帮助。

2 个答案:

答案 0 :(得分:8)

您的<ul> <li>Item 1</li> <li>Item 2</li> <li>Item 3</li> <li>Item 4</li> </ul>文件缺少必要的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) {} 传递std::string的可能性。它曾经是传递字符串的指南,直到C ++ 11出现并创建了关于传递大对象的最佳实践的持续讨论。

答案 1 :(得分:1)

开始以下内容:

Person(string name);

应该是

Person(const string& name);

表现

并且string name应该在私有位中,

然后签名

void changeName(Person* person, string name);
标题中的

与.cpp文件中的代码不同

 void changeName(Person* &person, string name) {

也按照其他人的说明加入#include