ПрограммированиеФорумОбщее

С++ не работает friend function!

Страницы: 1 2 3 Следующая »
#0
8:21, 26 июля 2012

Приветствую!

Нижеприведённый код не компилируется в 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!

Какие будут соображения?

#1
8:32, 26 июля 2012

Хм... щас выяснилось что проблема была в том что функция и класс лежат в ОДНОМ неймспейсе, который
я здесь в коде убрал, дабы не запутывать местных. Чё за...

#2
8:40, 26 июля 2012

Какие укурки проектировали С++?

вот так работает:

//namespace MYSpace
//{
  class Core
  {
    friend Core* GetCOREInterface();

  private:

    Core();
    ~Core();
  };

  Core* GetCOREInterface();
//}

а вот так уже нет:

namespace MYSpace
{
  class Core
  {
    friend Core* GetCOREInterface();

  private:

    Core();
    ~Core();
  };

  Core* GetCOREInterface();
}

!???

#3
8:46, 26 июля 2012

TheGrayWolf

Ванга моде он.
Прорицаю перед лицом всех живущих, умерших и еще не родившихся:

TheGrayWolf неправильно юзает неймпспейс в *.cpp реализации!

Силою Сатаны заклинаю моё прорицание на верность и непогрешность, силами ангелов запечатываю сиё колдовство!
Амнинь.

#4
8:50, 26 июля 2012

=A=L=X=

#include "Core.h"

using namespace MYSpace;


Core* GetCOREInterface()
{
  return new Core();
}


Core::Core()
{
  //...
}


Core::~Core()
{
  //...
}

Где я вот тут мог ошибиться?

#5
8:51, 26 июля 2012

TheGrayWolf
> Где я вот тут мог ошибиться?
Ты декларируешь новую функцию GetCOREInterface в глобальном неймспейсе. У тебя бы даже без френдов ничего не слинковалось бы.

#6
8:52, 26 июля 2012

Продолжаю фаломорфировать дальше, вот ЭТО компилируется!!!

void* GetCOREInterface();

namespace MYSpace
{
  class Core
  {
    friend void * ::GetCOREInterface();

  private:

    Core();
    ~Core();
  };
}

Проблема вобщем-то решена, но почему в одом неймспейсе-то нельзя френд-функцию держать?

И это самый натуральный КОСТЫЛЬ, пришлось жертвовать типом возвращаемого значения ради работоспособности!

#7
8:58, 26 июля 2012

-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-ом посте.

#8
9:26, 26 июля 2012

Нашёл я причину недуга. Вот так всё работает)

Core * MYSpace::GetCOREInterface()
{
  return new Core();
}
#9
9:26, 26 июля 2012
#include "Core.h"

namespace MYSpace {
   Core * GetCOREInterface() {
      return new Core();
   }

   Core::Core() {  /*...*/ }
   Core::~Core() {  /*...*/}
}
#10
9:27, 26 июля 2012

TheGrayWolf
Еще раз.
Ты декларируешь НОВУЮ функцию GetCOREInterface в ГЛОБАЛЬНОМ пространстве имен. Попробуй скомпилировать пустую функцию GetCOREInterface, и у тебя будет ошибка линковки.

Правка: А, все.

#11
10:08, 26 июля 2012

TheGrayWolf
> using namespace MYSpace;
неправильно.

#include "Core.h"

namespace MYSpace
{
  Core * GetCOREInterface()
  {
    return new Core();
  }
  
  
  Core::Core()
  {
    //...
  }
  
  
  Core::~Core()
  {
    //...
  }
}
[/cpp]
правильно.
#12
10:14, 26 июля 2012

cranky
> правильно.
Уродливо.

> TheGrayWolf
> Core * MYSpace::GetCOREInterface() { return new Core(); }
Красиво

#13
10:18, 26 июля 2012

-Eugene-
> > TheGrayWolf
> > Core * MYSpace::GetCOREInterface() { return new Core(); }
> Красиво
посмотрю на твое красиво, когда 1) будет 3-4 вложенных неймспейса, а не один и 2) когда в cpp файле будет не одно определение, а пара десятков

и да, в чем сакраментальный смысл приватного деструктора? видимо, должна быть friend void UngetCOREInterface()?

#14
10:18, 26 июля 2012

-Eugene-
> Core * MYSpace::GetCOREInterface() { return new Core(); }
тоже неправильно, ты забыл кое-что

MYSpace::Core * MYSpace::GetCOREInterface() { return new MYSpace::Core(); }

:3

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.