0

次のようなクラス関数があるとします。

class foo {
    // Private data needs to be accessed by bar
public:
    static int bar();
};

int main(int argc, char** argv) {
    // Want to write bar() instead of foo::bar()
    bar();
}

usingクラスメンバーをグローバルスコープにインポートするためには機能しないようですbar。グローバル関数にすると、プライベートデータにアクセスできなくなります。bar修飾されていない名前でグローバルスコープでアクセスできるようにする方法はありますか?

4

5 に答える 5

4
int bar()
{
    return foo::bar(); 
}
于 2012-08-31T12:19:38.957 に答える
2

foo::bar どこかに書く必要がありますが、関数で隠すことができます。

int bar()
{ return foo::bar(); }

int main(int argc, char** argv) {
     // Want to write bar() instead of foo::bar()
     bar();
 } 
于 2012-08-31T12:21:04.740 に答える
1

それがfriendsの目的です。

class foo {
    int i;
    // Private data needs to be accessed by bar
public:
    friend int bar(foo);
};

int bar(foo f) {
    return f.i = 3;
}

int main(int argc, char** argv) {
    foo g;
    // Want to write bar() instead of foo::bar()
    bar(g);
}
于 2012-08-31T14:39:46.710 に答える
0

fooとにかくクラスに属していないので、静的なものを除外します。クラスと名前空間の唯一の機能上の違いは、クラスをインスタンス化できることです。(静的メンバー関数を使用しているので)明らかにそれは必要ないので、次のように変更fooすることもできます。

namespace foo {
    class fooData { // optional, if you must hide the private data
      friend int bar();
      // Private data needs to be accessed by bar
    };
    int bar();
};

using foo::bar;
于 2012-08-31T12:28:31.583 に答える
0

他の人が言ったように、スタブグローバル関数。またはマクロ:

#define bar foo::bar

C#のように、名前空間にインポートする実際の方法はありませんusing

于 2012-08-31T12:33:05.043 に答える