0

メイン クラスで使用されている配列に別のクラスからアクセスしようとすると問題が発生します。私のアプリケーションは、2D プラットフォーム ゲームを作成するためのエディターです。基本的に、2D アセット (セグメント) を配置してレベルを構築することができます。

私のメイン クラスは、マップ セグメント クラスの配列を処理し (配列内の各セグメント クラスは、マップ上のセグメントの位置、縮尺、回転などの情報を保持します)、それらを画面に描画します。

メインクラスで初期化され、ファイルから利用可能なセグメントのグリッドを描画するために使用される、基本的にパネル(ドラッグ可能で、Photoshop などで見られるようにサイズ変更可能)である別のクラスがあります。私が必要としているのは、セグメントの 1 つをクリックして、メイン クラスで参照される配列に情報を追加する機能です。

配列を宣言するメインクラス「Map」があります。

map.h (簡略化)

class Map
{
public:
  MapSegment* mapSeg[512];
};

次に、パネルを作成して使用可能なセグメントを表示するときに、その配列の参照を送信しようとしています。

Panel* segmentPane = new SegmentPanel(sf::Rect<float>(200,200,250,200), mapSeg);

セグメント パネル ヘッダーは次のように形成されます。

class SegmentPanel : public Panel
{
public:
    SegmentPanel(sf::Rect<float> _position, MapSegment* mapSeg[512];);
    void Update();
    void Draw(sf::RenderWindow & renderWindow);
    void ReadSegments();
private:
    std::vector<SegmentDefinition *> segDef;
    MapSegment* mapSeg[512];
};

そしてSegmentPanel cpp:

SegmentPanel::SegmentPanel(sf::Rect<float> _position, MapSegment* mapSeg[512])
    : Panel(_position)
{
    panelTitle = "Segment Selection";
}

void SegmentPanel::Update()
{
    // Update segments
}

void SegmentPanel::Draw(sf::RenderWindow & renderWindow)
{
    // Draw default panel items
    Panel::Draw(renderWindow);

// Draw segments
}

ただし、SegmentPanel.cpp クラスから配列に要素を追加しても、メインの Main クラスに反映されていないようです。メモリ内に新しい配列が作成されているようです。

C# で作業した後、私はまだ C++ にかなり慣れていません。

4

1 に答える 1

4

まず、C++ には配列パラメーター型のようなものはありません。SegmentPanelコンストラクターでは、パラメーターは実際には;MapSegment* mapSeg[512]と同等です。MapSegment** mapSegそれは単なるポインタへのポインタです!

Panel* segmentPane = new SegmentPanel(sf::Rect<float>(200,200,250,200), mapSeg);

ここでは、配列を渡そうとしますmapSeg。これは、配列からポインターへの変換を受け、最初の要素 (a MapSegment**) へのポインターに変換され、そのポインターが渡されます。

これで問題ありませんがmapSeg、コンストラクターの引数では何もしません。配列にアクセスしたい場合は、そのポインタをどこかに保存する必要があります。呼び出し先のメンバーを次のように変更することで、これを行うことができます。SegmentPanelmapSeg

MapSegment** mapSeg;

次に、コンストラクターを次のように変更します。

SegmentPanel::SegmentPanel(sf::Rect<float> _position, MapSegment** mapSeg)
    : Panel(_position), mapSeg(mapSeg)
{
    panelTitle = "Segment Selection";
}

mapSegメンバー初期化リストの初期化に注意してください。


これを行う別の方法は、代わりに配列型引数への参照を取得することです。コンストラクタは次のようになります。

SegmentPanel::SegmentPanel(sf::Rect<float> _position, MapSegment* (&mapSeg)[512])
    : Panel(_position), mapSeg(mapSeg)
{
    panelTitle = "Segment Selection";
}

引数の型はmapSeg「512個のポインタの配列への参照MapSegment」です。mapSeg次に、メンバーを同じタイプにする必要があります。

于 2013-03-28T14:32:46.510 に答える