0

トラックにレンガがある小さなゲームを書こうとしています。

私の問題は、トラック クラスにブリックのベクトルを持ちたいのですが、ブリック クラスのトラックへのポインターを保持する必要があることです。

私がやろうとしていたのは、track.h と brick.h の 2 つのヘッダー ファイルを用意することで、brick.h ファイルに track.h を含めたい、またはその逆を行いたいと考えていました。

レンガ.h:

#pragma once

#include "track.h"

class brick
{
    public:
        brick (track &theTrack);
    private:
        track *mTrack;
};

brick::brick(track &theTrack)
{
    mTrack = &theTrack;
}

track.h:

#pragma once

#include "brick.h"

class track
{
    public:

    private:
        vector<brick> brickPositions;
};

ただし、これによりコンパイル エラーが発生します。

これらのクラスには .cpp ファイルを使用せず、先頭に #pragma once を含む .h ファイルを 1 つだけ使用します。

何が問題なのか、どうすれば解決できるのか説明していただけますか?

4

2 に答える 2

3

前方宣言を行うことができます:

 #pragma once

class brick;
class track
{
    public:

    private:
        vector<brick> brickPositions; //This might not compile, should be a pointer
};

ただし、cpp ファイルが必要です。

トラック.cpp:

    class brick
    {
        public:
            brick (track &theTrack);
        private:
            track *mTrack;
    };

    brick::brick(track &theTrack)
    {
        mTrack = &theTrack;
    }

クラスブリックで追跡するためにポインターのみを使用するため、逆の方法を実行します (クラスブリックの前にトラックを前方宣言します)。

PSこの下の答えを受け入れてください:)

于 2013-09-17T12:01:25.727 に答える
2

brickクラスにはクラスへのポインターしかないためtrack、前方宣言を使用できます。

#pragma once

class track;

class brick
{
    public:
        brick (track &theTrack);
    private:
        track *mTrack;
};

brick::brick(track &theTrack)
{
    mTrack = &theTrack;
}

trackクラスを変更する必要はありません。

于 2013-09-17T12:10:11.837 に答える