20

dllといくつかのアプリケーションコードの間で共有される基本クラスを作成する必要があるプログラムがあります。次に、2つの異なる派生クラスがあります。1つはdllにあり、もう1つはメインアプリケーションにあります。これらのそれぞれには、naseクラスのデータを操作するいくつかの静的メンバー関数があります。(他の場所で関数ポインターとして使用されるように、静的である必要があります)。最も単純な形で、私の問題を以下に示します。

class Base {
protected:
  int var ;
};

class Derived : public Base {
  static bool Process( Base *pBase ) {
    pBase->var = 2;
    return true;
  }
};

私のコンパイラは、DerivedがBaseへのアクセスを保護していても、pBaseの保護されたメンバーにアクセスできないと文句を言います。これを回避する方法はありますか、それとも私は何かを誤解していますか?Base変数をパブリックにすることはできますが、実際のインスタンスでは、これらは割り当てられたメモリの塊であり、マルチスレッドから保護するためのセマフォであるため、これは悪いことです。

ヘルプ?

4

2 に答える 2

14

一般に(関数が静的であるかどうかに関係なく)、派生クラスのメンバー関数は、そのタイプのオブジェクトの保護された基本クラスメンバーにのみアクセスできます。静的タイプが派生クラス(またはそれから派生したクラス)のタイプでない場合、ベースの保護されたメンバーにアクセスできません。それで:

class Base {
protected:
    int var;
 } ;

class Derived : public Base {
    static void f1( Derived* pDerived )
    {
        pDerived->var = 2; // legal, access through Derived...
    }
    static bool Process( Base *pBase )
    {
        pBase->var = 2 ;  // illegal, access not through Derived...
    }
} ;
于 2011-09-05T11:25:08.670 に答える
0

アクセス指定子は、クラス自体Derivedのメソッドではなく、クラス ハンドル (参照/ポインター/オブジェクト) に適用されます。Derivedメソッドが でなかったとしてもstatic、同じエラーになってしまいます。var派生ハンドルでアクセスしていないためです。デモ

正しい方法は、setterメソッドを提供することです:

class Base {
protected:
  int var ;
public:
  void setVar(const int v) { var = v; } // <--- add this method
};

注: もう 1 つの方法がありますが、それがエレガントかどうかはわかりません。

(static_cast<Derived*>(pBase))->var = 2;
于 2011-09-05T11:30:11.900 に答える