0

一般的な SDL 2 関数へのオーバーレイである C++ でいくつかのクラスを作成しています。

クラス A は SDL ウィンドウ データを保持し、それを操作します。

class A 
{
  protected:
    SDL_Window *window;

  public:
    SDL_Window* get_window(){ return window; }
};

クラス B は Renderer の管理を処理し、SDL ウィンドウ データへのアクセスを必要とします

class B : public A
{
  private:
    ...
  public:
    /** 
        This is the functions that access 
        the window data
    */
    void create_renderer( int index, Uint32 flags );
};

void B::create_renderer( int index, Uint32 flags )
{

  /**
     Input window data:
      The window data from class A, see the section "I have tried:"
       To see what I have tried to do to get the window data
  */
  SDl_CreateRenderer( (Input window data ), index, flags );
}

問題は、関数 create_renderer() でクラス B のクラス A からウィンドウ データにアクセスし、そのウィンドウ データを目的の関数 ( SDL_CreateRenderer( ... ) ) に渡すと、SDL_CreateRenderer( で segfault が発生することです。 ...)。これは、ウィンドウ データの間違ったアドレスがフィードされているためです。

私が試してみました:

this->window;
this->get_window();
window
get_window();

これらはすべてセグメンテーション違反になります

問題は、ウィンドウデータがあるメモリの場所にアクセスできないことです。

デバッガーを実行すると、ウィンドウ データのメモリ アドレスが、上記で指定したメソッドを使用したときに関数にフィードされるアドレスとは異なります。問題は、ウィンドウ データを取得しようとしている方法にあります。

関数の引数を使用してウィンドウ データを create_renderer() にフィードすることは知っていますが、プロジェクトの壮大なスキームでは、2 つのクラスが結び付けられており、ユーザーに多くの不要な作業を行わせるため、これはばかげています。

クラス B をクラス A のウィンドウ データにアクセスさせるにはどうすればよいですか?

クラスAとBにアクセスする方法:

class Overlord
{
   A a;
   B b;
};

Overlord overlord;

overlord.b.create_renderer( -1, 0 );

これが、クラス B と関数 create_renderer() にアクセスする方法の基本です。私が言ったように、クラス A とクラス B は、この質問の範囲外の大きなクラス スキームの一部です。お役に立てれば。

4

1 に答える 1

0

windowクラスメンバーをどのように初期化しますか? これが問題の根本にある可能性があります。

ただの疑い (または、 Raymond Chen が呼ぶように「サイキック デバッグ」 ) ですが、クラスのメンバーで初期化windowしていて、同じポインターがのメンバーに表示されることを期待している可能性はありますか? がから継承されているため、との両方のインスタンスを含める必要がある理由はよくわかりません。データ メンバーの継承が C++ でどのように機能するかを誤解しているのではないでしょうか?aOverlordwindowbOverlordOverlordABBA

于 2012-07-30T15:19:14.800 に答える