2013-05-14 5 views
-1

у меня есть:C++ переменных возможностей для класса друзей

class Game... 
class D3DGraphics... 

У меня есть переменная D3DGraphics типа под названием GFX заявил в своем классе Game.

я сделать еще несколько классов:

class Font... 
class Viewport... 

я сделать их оба друзьями D3DGraphics и объявлять переменные внутри D3DGraphics класса:

Font font; 
Viewport viewport; 

Наконец, в моем D3DGraphics я переменная обнародованная:

LPDIRECT3DDEVICE9 d3dDevice; 

мой класс шрифтов не может видеть d3dDevice, хотя это frie nd D3DGraphics?

Почему?

EDIT :: // теперь изменили код вокруг, чтобы подтолкнуть указатели через к внешним классам: 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
+4

Я не понимаю, какое название вашего вопроса имеет отношение к телу вашего вопроса. – inetknght

+0

И после определения названия вопроса, может быть, вы можете опубликовать небольшой пример того, что вы делаете (но просто пример - похоже, что ваш фактический код - довольно лабиринт). –

+0

Я добавил свой проект – Jimmyt1988

ответ

0

По крайней мере, если понимать правильно, вы ожидаете, что дружба будет транзитивной, т. е. A является другом B, а B является другом C, поэтому вы ожидаете, что A будет другом C.

Если это так, Ответ - это потому, что (как это определяет С ++) дружба не транзитивна.

+0

Итак, мне нужно создать 2 новые переменные в классе Game для Font и Viewport, а затем передать gfx в них? – Jimmyt1988

+0

@JamesT: существует множество различных способов обработки вещей. Это звучит для меня, как будто вы, вероятно, слишком много друг друга, и, вероятно, вам нужно определить свой публичный интерфейс, чтобы обеспечить то, что нужно. Основное использование друзей - это вещи, которые являются концептуально функциями-членами, но (например) должны быть свободными функциями для поддержки конверсий в их левых операндах. –

+0

Как правило, есть много частных членов класса, например класс My Game, а затем передавать в них вещи, чтобы они обладали видимостью внутри класса Game? Поскольку я никогда не видел кого-то код elses, я не уверен, что я все хорошо делаю? – Jimmyt1988

0

Если ваш код выглядит что-то вроде

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

, то это не будет работать без

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

Friendship is not reciprocal. Если A заявляет B друг, A объектов не получают никаких особых привилегий для B объектов.

(? Кстати, где находятся содержимое Font.h появился файл, и поддерживает мою гипотезу.)

Кроме того, D3DGraphics.h и Font.h являются циркулярно зависимыми, и Font.h не имеет включать охрану; включая его сначала, будет включать его дважды, что может привести к жалобам компилятора о переопределении class Font.

+0

Я прикрутил свой репозиторий вверх .. попробуйте сейчас (проверьте новую ссылку) – Jimmyt1988

+0

спасибо за беседу охранника. Сейчас я разместил прагмы. – Jimmyt1988

Смежные вопросы