c++变量作用域的类友

C++ variable scope for class friends

本文关键字:作用域 变量 c++      更新时间:2023-10-16

我有:

class Game... 
class D3DGraphics...

我在Game类中声明了一个名为gfx的D3DGraphics类型变量。

我又创建了几个类:

class Font...
class Viewport...

我使它们都是D3DGraphics的朋友,并在D3DGraphics类中声明变量:

Font font;
Viewport viewport;

最后在我的D3DGraphics我有一个变量公开:

LPDIRECT3DDEVICE9 d3dDevice;

我的字体类不能看到d3dDevice,即使它是D3DGraphics的朋友?

为什么?

编辑:://现在已经改变了代码,通过外部类推送指针:https://github.com/jimmyt1988/TheGame/tree/master/TheGame

  • windows.cpp//我在这里创建我的游戏对象并通过我的hWnd。
  • Game.cpp/Game.h
  • Font.cpp/Font.h
  • D3DGraphics.cpp/D3DGraphics.h
  • Viewport.cpp/Viewport.h

至少如果理解正确的话,你期望友谊是传递的——也就是说,A是B的朋友,B是C的朋友,所以你期望A是C的朋友。

如果是,简单的答案是因为(如c++所定义的)友谊不是可传递的。

如果你的代码看起来像

class Font {
  ...
  friend class D3DGraphics;
  ...
}

那么没有

它就不能工作
class D3DGraphics {
  ...
  friend class Font;
  ...
}

友谊不是相互的。如果A声明B为友元,则A对象没有B对象的特权。

(顺便问一下,Font.h的内容在哪里文件已经出现,并且支持我的假设)

同样,D3DGraphics.hFont.h是循环依赖的,Font.h没有include保护;首先包含它将包含它两次,这可能导致编译器抱怨重新定义class Font