6

クライアントがプロセスごとに1つのオブジェクトを作成することだけを希望するクラスがあります。シングルトンの代わりに、より良い方法(私は信じています)は、main()でのみ作成するようにクライアントに指示することです。したがって、自然な強制は、コンストラクターをプライベートにし、main()をフレンドにすることです。

これは次のように機能します。

class A { friend int main(int, char**); A() {} };
int main(int, char **) { A a; }

しかし、クラスAを名前空間に配置する必要がある場合は壊れます。

namepace ns { class A { friend int main(int, char**); A() {} }; }
int main(int, char **) { ns::A a; }

問題はスコーピングです:コンパイラは今考えています

friend int main 

名前空間nsのmain()という名前の関数を意味します。したがって、実際のmain()は無関係になります。

だから問題は:これを修正する方法は?もちろん、クラスAを名前空間に入れる必要があります。

4

2 に答える 2

6

宣言は周囲の名前空間でのみ名前を導入できるmainため、クラス定義の前にグローバル名前空間で宣言する必要があります。friend

int main(int, char**);

名前空間内で参照するときに名前を修飾します。

namepace ns { class A { friend int ::main(int, char**); A() {} }; }
//                                 ^^
于 2013-01-29T12:28:57.420 に答える
5

" ::" を使用して、何かをグローバル名前空間にあると修飾します。つまり、次のようになります。

friend int ::main(int argc, char** argv);
于 2013-01-29T12:21:42.490 に答える