2012-02-12 5 views
1

何とかグローバルスコープをクラスのフレンドとして宣言できますか?プライベートコンストラクタを持つクラスのグローバルオブジェクト

class Foo 
{ 
    Foo() {} 
}; 

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

だから、私が欲しいものをグローバルスコープでFooのオブジェクトを宣言することができることですが、ではないどこか他:

私が直面しています問題は、次のようです。この質問は、純粋に関心の外にある

注、私は実際の問題を解決しようとしていませんよ。

+0

いいえ、できません。 –

+0

@セス:私はそれが友人を使って可能だろうとは思わなかったが、多分、同じ振る舞いを得るための回避策があるかもしれない。 – Job

+0

あなたは 'シングルトン'の振る舞いをしたいと思うし、 'シングルトン'を作るメソッドがたくさんあります – Lol4t0

答えて

1

いいえ、それはできません。特定のクラスまたは関数の名前は、友人としてのみ指定できます。グローバルな名前空間を含む名前空間を友人にすることはできません。

私は良い仕事が周りに存在しない理由は、あなたがクラスや関数を定義するとき、唯一の定義は(実際には異なる機能であるオーバーロードを、考慮しない)許可されていることだと思います。しかし、あなたはネームスペースを何回でも開くことができ、そのたびに余分なものを追加することができます。したがって、特定の名前空間にアクセスできる場合は、誰でも入力できます。

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. 
} 
+0

確かに、誰かが賢明な回避策を思いつくことを期待していました。 – Job

+0

私は十分に巧妙ではありません。私が回避策を考えることができれば、私は答えを出したでしょう。 :)しかし、私が知る限り、私は正しい答えは「いいえ」だと思う。 –

+0

それは私が恐れていたものです。とにかく、あなたの答えを受け入れる前に、何かが起きたかどうかを少しでも待っています。 – Job

関連する問題