Приветствую!
Нижеприведённый код не компилируется в VS2008! Компилятор просто игнорирует директиву friend!
hpp
class Core { friend Core* GetCOREInterface(); private: Core( ); ~Core( ); }; Core* GetCOREInterface( );
cpp
Core* GetCOREInterface() { return new Core( ); } Core::Core( ) { //... } Core::~Core( ) { //... }
Вот ошибка компиляции:
error C2248: Core::Core: невозможно обратиться к private член, объявленному в классе "Core"
Эксперементировал с friend class, всё работает, но мне нужно именно friend function!
Какие будут соображения?
Хм... щас выяснилось что проблема была в том что функция и класс лежат в ОДНОМ неймспейсе, который
я здесь в коде убрал, дабы не запутывать местных. Чё за...
Какие укурки проектировали С++?
вот так работает:
//namespace MYSpace //{ class Core { friend Core* GetCOREInterface(); private: Core( ); ~Core( ); }; Core* GetCOREInterface( ); //}
а вот так уже нет:
namespace MYSpace { class Core { friend Core* GetCOREInterface(); private: Core( ); ~Core( ); }; Core* GetCOREInterface( ); }
!???
TheGrayWolf
Ванга моде он.
Прорицаю перед лицом всех живущих, умерших и еще не родившихся:
TheGrayWolf неправильно юзает неймпспейс в *.cpp реализации!
Силою Сатаны заклинаю моё прорицание на верность и непогрешность, силами ангелов запечатываю сиё колдовство!
Амнинь.
=A=L=X=
#include "Core.h" using namespace MYSpace; Core* GetCOREInterface() { return new Core( ); } Core::Core( ) { //... } Core::~Core( ) { //... }
Где я вот тут мог ошибиться?
TheGrayWolf
> Где я вот тут мог ошибиться?
Ты декларируешь новую функцию GetCOREInterface в глобальном неймспейсе. У тебя бы даже без френдов ничего не слинковалось бы.
Продолжаю фаломорфировать дальше, вот ЭТО компилируется!!!
void* GetCOREInterface(); namespace MYSpace { class Core { friend void * ::GetCOREInterface( ); private: Core( ); ~Core( ); }; }
Проблема вобщем-то решена, но почему в одом неймспейсе-то нельзя френд-функцию держать?
И это самый натуральный КОСТЫЛЬ, пришлось жертвовать типом возвращаемого значения ради работоспособности!
-Eugene-
ЩИТО? Привожу ПОЛНЫЙ нерабочий код:
hpp
namespace MYSpace { class Core { friend Core * GetCOREInterface(); private: Core( ); ~Core( ); }; Core * GetCOREInterface( ); }
cpp
#include "Core.h" using namespace MYSpace; Core * GetCOREInterface() { return new Core( ); } Core::Core( ) { //... } Core::~Core( ) { //... }
Вот это НЕ РАБОТАЕТ, линковка тут не причём, ошибка компиляции в 1-ом посте.
Нашёл я причину недуга. Вот так всё работает)
Core * MYSpace::GetCOREInterface() { return new Core( ); }
#include "Core.h" namespace MYSpace { Core * GetCOREInterface() { return new Core( ); } Core::Core( ) { /*...*/ } Core::~Core( ) { /*...*/} }
TheGrayWolf
Еще раз.
Ты декларируешь НОВУЮ функцию GetCOREInterface в ГЛОБАЛЬНОМ пространстве имен. Попробуй скомпилировать пустую функцию GetCOREInterface, и у тебя будет ошибка линковки.
Правка: А, все.
TheGrayWolf
> using namespace MYSpace;
неправильно.
#include "Core.h" namespace MYSpace { Core * GetCOREInterface() { return new Core( ); } Core::Core( ) { //... } Core::~Core( ) { //... } } [/cpp] правильно.
cranky
> правильно.
Уродливо.
> TheGrayWolf
> Core * MYSpace::GetCOREInterface() { return new Core(); }
Красиво
-Eugene-
> > TheGrayWolf
> > Core * MYSpace::GetCOREInterface() { return new Core(); }
> Красиво
посмотрю на твое красиво, когда 1) будет 3-4 вложенных неймспейса, а не один и 2) когда в cpp файле будет не одно определение, а пара десятков
и да, в чем сакраментальный смысл приватного деструктора? видимо, должна быть friend void UngetCOREInterface()?
-Eugene-
> Core * MYSpace::GetCOREInterface() { return new Core(); }
тоже неправильно, ты забыл кое-что
MYSpace::Core * MYSpace::GetCOREInterface() { return new MYSpace::Core( ); }
:3
Тема в архиве.