虽然我确定这是一个常见问题,但我还是找不到这个问题。我发现的最接近的是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(.....)
)来做这件事?
感谢您的帮助。
答案 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