C++ C++;类朋友的可变范围

C++ C++;类朋友的可变范围,c++,scope,friend,C++,Scope,Friend,我有: 在我的游戏类中声明了一个名为gfx的D3DGraphics类型的变量 我又上了几节课: class Game... class D3DGraphics... 我让他们成为D3DGraphics的朋友,并在D3DGraphics类中声明变量: class Font... class Viewport... 最后,在我的D3DGraphics中,我公开了一个变量: Font font; Viewport viewport; 我的字体类无法看到d3dDevice,即使它是D3DGrap

我有:

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

我又上了几节课:

class Game... 
class D3DGraphics...
我让他们成为D3DGraphics的朋友,并在D3DGraphics类中声明变量:

class Font...
class Viewport...
最后,在我的D3DGraphics中,我公开了一个变量:

Font font;
Viewport viewport;
我的字体类无法看到d3dDevice,即使它是D3DGraphics的朋友

为什么呢

EDIT:://现在已更改代码,将指针推送到外部类:

  • 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++定义的)友谊不是传递的。

如果你的代码看起来像

LPDIRECT3DDEVICE9 d3dDevice;
那没有它就不行了

class Font {
  ...
  friend class D3DGraphics;
  ...
}
如果
A
声明
B
朋友,
A
对象对
B
对象没有特权

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


而且,
D3DGraphics.h
Font.h
是循环相关的,
Font.h
没有包含保护;首先包含它将包含它两次,这可能会导致编译器抱怨重新定义
类字体

我不知道你的问题标题与你的问题主体有什么关系。在修复了问题标题后,也许你可以发布一个小例子,说明你正在做的事情(但仅举一个例子——听起来您的实际代码相当复杂).我已经添加了我的project@all为所有帮助我的人干杯,你帮了我很大的忙,我现在通过传递引用更自信了。我需要一个很好的提升。那么我需要在我的游戏类中为字体和视口创建两个新变量,然后将gfx传递给它们吗?@JamesT:有很多不同的方法可以让o处理事情。在我看来,您可能过度使用了友谊,可能需要定义您的公共界面来提供所需的内容。朋友的主要用途是用于概念上属于成员函数的东西,但是(例如)必须是自由函数才能支持对其左操作数的转换。一个类通常有很多私有成员,例如我的游戏类,然后将内容传递给它们,以便它们在游戏类中具有作用域吗?因为我从未见过其他人的代码,我不确定我是否做得很好?更好的问题是,是否有规则当你不应该使用朋友的时候。做朋友的事情而不是把所有需要的东西都传递给每一门课外课会有什么开销?我觉得视口和字体是相对于D3D图形的,但是……这意味着他们应该是朋友吗?@JamesT:不,这并不意味着他们应该是朋友。相反,像D3D这样的东西图形是视口或字体之类的自然客户端,所以它需要使用的可能是它们的公共界面。我把我的存储库搞砸了。现在试试(检查新链接)
class D3DGraphics {
  ...
  friend class Font;
  ...
}