LINUX.ORG.RU

Друг из другого namespace

 


0

2

Соррян, если плохо гуглил, да и запарился уже сильно, голов не варит. Как сделать друга? По-всякому пробовал писать

namespace Ns {
   class S {
      friend int ::main(); // error
      int i;
   };
}

int main() {
   Ns::S{};
   ++ s.i;
}

Ответ на: комментарий от utf8nowhere

Спасибо. Если все в одном неймспейсе, то форвард декларация не нужна, подумал, что объявление друга годится за декларацию и не возникло мысли сделать ещё одну.

kvpfs_2
() автор топика
Последнее исправление: kvpfs_2 (всего исправлений: 1)
Ответ на: комментарий от kvpfs_2

Если все в одном неймспейсе, то форвард декларация не нужна

namespace Ns {
	class S {
		friend int Ns::main(); // error
		int i;
	};
}
<source>:3:18: error: friend declaration of 'main' does not match any declaration in namespace 'Ns'
    3 |                 friend int Ns::main(); // error
      |                                ^~~~
utf8nowhere ★★★★
()
Ответ на: комментарий от utf8nowhere

Я про такое:

class S {
	friend int main();
	int i;
};

int main() {
   S s{};
   ++ s.i;
}

g++ ...
ok
kvpfs_2
() автор топика
Последнее исправление: kvpfs_2 (всего исправлений: 1)

А чего все фейспалмят? Из-за того что мейн дружит с классами и нарушает инкапсуляцию и всё такое?

Я применил очень красивое и правильное решение - есть системный код и юзерский код. Юзерский код подвешивается в виде плагинов, и юзает интерфейс, который ему дает система. Очевидно, что нужно как-то ограничить юзера в правах (не дать ему дернуть, то апи, которое для него не предназначено). И тут либо скрывать все символы и экспортировать поштучно со всякими компайлер специфик штучками, либо передавать в системное апи структуру-метку, создавать которую могут лишь системные сущности через дружбу с этой меткой. Все в рамках языка, без всяких declspec_хуек_атрибут_hiden

kvpfs_2
() автор топика
Последнее исправление: kvpfs_2 (всего исправлений: 1)
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.