C++不会让我交朋友

Leg*_*ion 30 c++ visual-c++

我有两个类,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行)

  • 错误C2143:语法错误:缺少';' 在'*'之前
  • 错误C4430:缺少类型说明符 - 假定为int.注意:C++不支持default-int
  • 错误C4430:缺少类型说明符 - 假定为int.注意:C++不支持default-int

  • mesh.h(11):错误C2653:'MeshList':不是类或命名空间名称

  • meshlist.cpp(5):错误C2248:'Mesh :: vboHandle_':无法访问类'Mesh'中声明的私有成员
  • mesh.h(10):看看'Mesh :: vboHandle_'的声明
  • mesh.h(8):看'Mesh'的声明
  • meshlist.cpp(5):错误C2100:非法间接

Gar*_*han 9

当你编译时Mesh.cpp,它包括Mesh.h,包括MeshList.h,哪些开始包含Mesh.h但是提前停止,因为_MESH_H现在定义了.然后(返回MeshList.h)有一个引用Mesh- 但尚未声明.因此,例如,您的C2143错误.

  • @Legion:你有一个循环依赖,通常是代码味道.无论如何,如果你真的觉得这在你的设计中是有意义的,那么你需要做的是*在'MeshList`定义之前声明*Mesh`(不需要完整的类型定义)和然后仅在.cpp中包含Mesh标头. (2认同)

Tam*_*ash 6

这是因为你#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)


Ste*_*han 6

循环依赖性在其他答案中解释...

解决方案如下:

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)