2011-04-01 3 views
0

Есть ли способ получить доступ к функции-члену из класса друзей?Функция-член доступа к C++ из класса друзей

// foo.h 

template<typename T> 
class A 
{ 
    bool operator()(Item* item) 
    { 
     ObjectClass c = get_class_from_item(item); // compiler error 
     ... 
    } 
}; 

class B 
{ 
    ... 
    template<typename T> friend class A; 
    ... 
    ObjectClass get_class_from_item(Item* item); 
}; 

Если это имеет значение я использую GCC 4.5.2

ответ

3

Если get_class_from_item должна быть какая-то функция фабрики, которую он, кажется, вы должны сделать его статическим. Вы получаете ошибку, потому что ваш компилятор ищет функцию с именем get_class_from_item в классе A. Он никогда не увидит функцию в B, потому что она не входит в область действия и у вас нет экземпляра класса B. Вот еще несколько объяснений в Википедии: http://en.wikipedia.org/wiki/Factory_function.

Это следует сделать это:

class A 
{ 
    bool operator()(Item * item) 
    { 
     ObjectClass c = B::get_class_from_item(item); 
     ... 
    } 
}; 

class B 
{ 
    static ObjectClass get_class_from_item(Item* item); 
}; 

Кроме того, есть причина, по которой A потребности быть другим классом B? Или вы просто сделали это, пытаясь заставить get_class_from_item работать? A должен иметь доступ к некоторым частным элементам B? Подумайте об этом, большую часть времени есть лучшие способы получить то, что вы хотите, а не выбрасывать все инкапсуляции, используя friend.

[Редактировать] Удалены строки из примера кода, чтобы разбить его до минимума.

+0

Это не заводская функция. Он просто получает 'item' и возвращает' ObjectClass', который имеет элемент: 'return classes [item-> data (...)]'. OTOH Я не могу заставить 'get_class_from_item' статичным, потому что он использует некоторые элементы, которые не могут быть статическими (они изменяются во время выполнения). – maverik

+0

Дело в том, что 'A' не располагает достаточной информацией для выполнения своей задачи. Поэтому я, вероятно, должен исправить дизайн. Спасибо всем. – maverik

2

Нет, поскольку get_class_from_item - это функция-член, для которой вам нужен экземпляр класса B.

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