web-dev-qa-db-ja.com

エラー:静的メンバー関数でのメンバーの無効な使用

私には2つのクラスがあり、これはそのうちの1つのヘッダーです。

#ifndef WRAPPER_HPP
#define WRAPPER_HPP

#include <SDL/SDL.h>

using namespace std;

class Wrapper
{
  private:
    //SDL_Surface *screen;

  public:
    static SDL_Surface *screen;

    static void set_screen(SDL_Surface *_screen);
    static void set_pixel(int x, int y, Uint8 color);
    static void clear_screen(int r, int g, int b);
    static SDL_Surface* load_image(char path[500]);
    static void draw_image(SDL_Surface *img, int x, int y, int width, int height);
    static void draw_line(int x1, int y1, int x2, int y2, Uint8 color);
};

#endif

別のファイルからWrapper :: set_screen(screen)を呼び出していると、次のエラーが発生します。

In file included from /home/david/src/aships/src/Wrapper.cpp:6:0:
/home/david/src/aships/src/Wrapper.hpp: In static member function ‘static void Wrapper::set_screen(SDL_Surface*)’:
/home/david/src/aships/src/Wrapper.hpp:11:18: error: invalid use of member ‘Wrapper::screen’ in static member function
/home/david/src/aships/src/Wrapper.cpp:10:3: error: from this location

Wrapper.cppのすべての関数の定義でも同様のエラーが発生します。次に例を示します。

void Wrapper::set_pixel(int x, int y, Uint8 color)
{
  /* Draws a pixel on the screen at (x, y) with color 'color' */
  Uint8 *p;
  p = (Uint8 *) screen->pixels + y * screen->pitch + x * screen->format->BytesPerPixel;
  *p = color;
}

コンパイル時:

/home/david/src/aships/src/Wrapper.hpp: In static member function ‘static void Wrapper::set_pixel(int, int, Uint8)’:
/home/david/src/aships/src/Wrapper.hpp:11:18: error: invalid use of member ‘Wrapper::screen’ in static member function
/home/david/src/aships/src/Wrapper.cpp:17:17: error: from this location

私はそれが静的なクラスに関連しているので、変数Wrapper.screenにアクセスできないか何かを知っていますが、それを修正する方法がわかりません。何か案は?

7
David Gomes

静的変数を使用しています

static SDL_Surface *screen;

あなたのコードで。

C++では、.h(または.hpp)で静的変数を宣言すると、クラスに対して一般的(静的)な変数が作成されます。したがって、別のファイルでそれを使用するには、静的ファイルを参照する変数をそのファイルに作成するために、それを再宣言する必要があります(私はそうではないと思います)。あなたのケースではこれを入れてください:

SDL_Surface* Wrapper::screen;

。cppファイル内

理論がよく説明されているかどうかはわかりませんが、そのように機能します。

5
user2536820

クラスとメンバー(画面)は静的ではありません。つまり、実際には存在しません。静的関数で非静的メンバーにアクセスすることはできません。

データメンバーが静的になるようにしてください。

0
asafrob

私たちが示したコードの要約が問題の正確な特徴付けであるとは確信していません。

ヘッダーには_using namespace std;_を含めないでください— std名前空間から何も使用または宣言しないため、_using namespace std;_を指定することは一般に「良いアイデアではない」と見なされます。ヘッダーファイルに表示されます。

ヘッダーに_SDL/SDL.h_を含める必要があるかどうかも明確ではありません。 _Uint8_型を簡単に分離できる場合(必ずしも有効ではない)、ヘッダーファイルは_SDL_Surface_クラスの前方宣言を使用できます。 (実装コードには_SDL/SDL.h_を含める必要がありますが、単純な前方宣言で十分な場合は、ラッパークラスのユーザーに不要な_#include_ディレクティブを負担させないでください。)

このコードは自己完結型です(ヘッダーは必要ありません)が、多かれ少なかれ、使用できるものをシミュレートし、コンパイルはOKです。

_#ifndef WRAPPER_HPP
#define WRAPPER_HPP

typedef unsigned char Uint8;
class SDL_Surface;

class Wrapper
{
public:
    static SDL_Surface *screen;

    static void set_screen(SDL_Surface *_screen);
    static void set_pixel(int x, int y, Uint8 color);
    static void clear_screen(int r, int g, int b);
    static SDL_Surface *load_image(char path[500]);
    static void draw_image(SDL_Surface *img, int x, int y, int width, int height);
    static void draw_line(int x1, int y1, int x2, int y2, Uint8 color);
};

#endif

//#include <SDL/SDL.h>

typedef unsigned short Uint16;

class SDL_Surface
{
public:
    Uint8   *pixels;
    Uint16   pitch;
    struct
    {
        Uint8 BytesPerPixel;
    }       *format;
};

// End of SDL/SDL.h

void Wrapper::set_pixel(int x, int y, Uint8 color)
{
    /* Draws a pixel on the screen at (x, y) with color 'color' */
    Uint8 *p;
    p = (Uint8 *) screen->pixels + y * screen->pitch + x * screen->format->BytesPerPixel;
    *p = color;
}
_

また、警告なしでコンパイルされます。 _(Uint8 *)_キャスト(オリジナルからコピー)は不要です。与えられたクラス定義では、それは不必要です。 _SDL_Surface_のpixelsメンバーの型が実際に_Uint8_ではないためにキャストを使用する必要がある場合、それが良い考えですか?そして、それを明確にするために代わりにreinterpret_cast<Uint8>(screen->pixels)を使用することはできませんか?


問題を、実際のエラーを示す、これに類似したコードに削減できますか?

0