我有两个类,Mesh和MeshList.我希望MeshList具有可以更改Mesh的私有成员的函数.但它不会编译,我不知道为什么.这是我的代码.
Mesh.h
#ifndef _MESH_H
#define _MESH_H
#include "MeshList.h"
#include <iostream>
class Mesh
{
private:
unsigned int vboHandle_;
friend void MeshList::UpdateVBOHandle();
public:
inline void Out() {std::cout << vboHandle_;}
};
#endif
Run Code Online (Sandbox Code Playgroud)
Mesh.cpp
#include "Mesh.h"
Run Code Online (Sandbox Code Playgroud)
MeshList.h
#ifndef _MESH_LIST_H
#define _MESH_LIST_H
#include "Mesh.h"
class MeshList
{
public:
Mesh *mesh; //Line 11 Error
void UpdateVBOHandle();
};
#endif
Run Code Online (Sandbox Code Playgroud)
MeshList.cpp
#include "MeshList.h"
void MeshList::UpdateVBOHandle()
{
*mesh->vboHandle_ = 4;
}
Run Code Online (Sandbox Code Playgroud)
我收到这些错误:
MeshList.h(第11行)
错误C4430:缺少类型说明符 - 假定为int.注意:C++不支持default-int
mesh.h(11):错误C2653:'MeshList':不是类或命名空间名称
当你编译时Mesh.cpp,它包括Mesh.h,包括MeshList.h,哪些开始包含Mesh.h但是提前停止,因为_MESH_H现在定义了.然后(返回MeshList.h)有一个引用Mesh- 但尚未声明.因此,例如,您的C2143错误.
这是因为你#include "MeshList.h"在文件中Mesh.h,因此MeshList.h首先编译文件,并且Mesh尚未声明该类.为此,编译器会认为Mesh在错误行中是一个在它之前没有类型的变量名,因此错误.
这是一个friend成员函数的例子:
#include <iostream>
class foo;
class bar
{
public:
void barfunc(foo &f);
};
class foo
{
private:
friend void bar::barfunc(foo &f);
int i;
public:
foo()
{
i = 0;
}
void printi()
{
std::cout << i << '\n';
}
};
void bar::barfunc(foo &f)
{
f.i = 5;
}
int main()
{
foo f;
bar b;
b.barfunc(f);
f.printi();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
循环依赖性在其他答案中解释...
解决方案如下:
在MeshList.h:
#include "Mesh.h"为前向声明class Mesh;(这里不需要包含,因为你只声明一个指向Mesh的指针)在MeshList.cpp:
#include "Mesh.h"到您的包含(您需要声明,因为您使用网格)你提到的最后一个编译错误是另一个问题:
*mesh->vboHandle_ = 4;
Run Code Online (Sandbox Code Playgroud)
mesh是一个指针.您的代码选择成员vboHandle_并尝试取消引用它(失败).我想你的意思是:
mesh->vboHandle_ = 4; // <-- no leading asterisk
Run Code Online (Sandbox Code Playgroud)