Глобальный объект класса с приватным конструктором - PullRequest
1 голос
/ 12 февраля 2012

Можно ли как-то объявить глобальную область как друга класса?

Проблема, с которой я сталкиваюсь, заключается в следующем:

class Foo
{
    Foo() {}
};

Foo foo; //error: 'Foo::Foo()' is private

Итак, я хочу иметь возможность объявлять объект Foo в глобальной области видимости, но не где-либо еще.

Обратите внимание, что этот вопрос не представляет интереса, я не пытаюсь решить реальную проблему.

1 Ответ

1 голос
/ 12 февраля 2012

Нет, это невозможно сделать.Вы можете назвать только определенные классы или функции друзьями.Невозможно сделать пространство имен, включающее в себя глобальное пространство имен, другом.

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

namespace TheNamesapceWithAccess
{
  // I've got access to it here too as well as
  // to the original namespace definition that was
  // the only one that was intended to be allowed access.
  // And I could define a function here that allows access the private thing
  // from outside this namespace. I've just subverted the access restriction
  // you intended.
}
...