5

C++n00bの質問。cppで定義された静的メソッドからプライベートコンストラクターを呼び出すことは可能ですか?可能であれば、メソッドをヘッダーファイルに入れないようにしたいのですが、これを行う方法があるはずだと思います。これを試みるとエラーが発生します:

「SomeClassクラスで宣言されたプライベートメンバーにアクセスできません」

/////////////////
// SomeClass.h //
/////////////////

class SomeClass {
    public:
        static SomeClass SomeMethod();
    private:
        SomeClass(int i);
}

///////////////////
// SomeClass.cpp //
///////////////////

static SomeClass OSImplementation() {
    return SomeClass(0);
};

// calls implementation
SomeClass SomeClass::SomeMethod() {
    return OSImplementation();
}
4

2 に答える 2

4

OSImplementation友達メソッドを作ることができます。

または、クラス内で静的メソッドを作成することもできますOSImplementation(ただし、ヘッダーで宣言する必要があります)。

または、おそらくこれを行う最も一般的な方法は、次のような内部実装クラスを持つことです。

class SomeClass {
public:
    //...
private:
    struct Impl;
    Impl* intern;
};

cppファイルで、を宣言しstruct SomeClass::Implます。

コンストラクターで、SomeClass::Implインスタンスを作成します。デストラクタで削除します。そして、コピーコンストラクタと代入演算子を実装してください!

これは、PIMPL(実装へのポインター)イディオム(Wikipediac2.com)と呼ばれます。Qtのような大きなプロジェクトでよく使われます。

于 2012-06-22T18:52:58.653 に答える
1

はい、OSImplementation()SomeClassの友達を作ることで可能です。次の例は、g ++ 4.6.1を使用して、警告やエラーなしでコンパイルします。

#include <iostream>

// declare in hpp
class SomeClass {

   friend SomeClass OSImplementation();

    public:
        static SomeClass SomeMethod();

        void foo();

    private:
        SomeClass(int);
};


int main()
{
  auto obj = SomeClass::SomeMethod();

  obj.foo();
}

// define in cpp
SomeClass SomeClass::SomeMethod(){
  return SomeClass( 5 );
}

SomeClass::SomeClass(int){
}

void SomeClass::foo(){
  std::cout<<"foo"<<std::endl;
}

SomeClass OSImplementation()
{
  return SomeClass::SomeMethod();
}
于 2012-06-22T19:01:01.010 に答える