Если 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
.
[Редактировать] Удалены строки из примера кода, чтобы разбить его до минимума.
Это не заводская функция. Он просто получает 'item' и возвращает' ObjectClass', который имеет элемент: 'return classes [item-> data (...)]'. OTOH Я не могу заставить 'get_class_from_item' статичным, потому что он использует некоторые элементы, которые не могут быть статическими (они изменяются во время выполнения). – maverik
Дело в том, что 'A' не располагает достаточной информацией для выполнения своей задачи. Поэтому я, вероятно, должен исправить дизайн. Спасибо всем. – maverik