0
template<class Rawr>
class TestContains;

template <class T>
class TestStore//: public TestContains
{
public:
    TestStore(T first, T second, T W, T H)
    {
        x = first;
        y = second;
        Width = W;
        Height = H;

        TestContains<T> a(x, y, Width, Height);

        *b = a;
    }
    ~TestStore() {};


    T x;
    T y;
    T Width;
    T Height;

TestContains<T>* GetRect();

protected:
private:
TestContains<T> *b;
};

CPP

template<class T>
TestContains<T>* TestStore<T>::GetRect()
{
    return &b;
}

テストに含まれるもの

template<class Rawr>
class TestContains
{
    public:
        TestContains(Rawr first, Rawr second,  Rawr W, Rawr H)
        {
            x = first;
            y = second;
            Width = W;
            Height = H;
        }

        ~TestContains(){};

    template <class T>
    bool Contains(T Mx, T My)
    {
       if (Mx >= x && Mx <= x + Width && My >= y && My <= My + Height)
       return true;

       return false;
    }

Rawr x;
Rawr y;
Rawr Width;
Rawr Height;

///friend?
template<class T>
friend class TestStore;

    protected:
    private:
};

実装

TestStore<int> test(0, 0, 100, 100);

if (test.GetRect().Contains(mouseX, mouseY))
{
    std::cout << "Within 0, 0, 100, 100" << std::endl;
}

とにかく...だから私はこれをコンパイルすることはできません

/home/chivos/Desktop/yay/ShoeState.cpp||メンバー関数内'virtualvoid ShoeState :: GameLoop(GameEngine *)':| /home/chivos/Desktop/yay/ShoeState.cpp|51|エラー:'test.TestStore :: GetRect with T=int'のメンバー'Contains'のリクエスト。これは非クラスタイプ'TestContains*'|です。|| ===ビルドが完了しました:1エラー、0警告=== |

私は長い間これをいじっていました、そしてそれは私を悩ませ始めています!笑、誰かが私が間違っていることを知っていますか?

4

2 に答える 2

2

エラーはtest.GetRect()、ポインタを返すことを示しています。オブジェクトへのポインタを介してメンバーにアクセスするには、次->の代わりにを使用する必要があり.ます。

//                ▾▾
if (test.GetRect()->Contains(mouseX, mouseY))
{
    std::cout << "Within 0, 0, 100, 100" << std::endl;
}
于 2013-03-25T15:11:49.640 に答える
2

2つの問題:1つは彼/彼女の答えの中でsftrabbitによって指摘されています。GetRectもう1つは、関数でポインターからポインターを返そうとすることです。address -of&演算子を使用すると、returnステートメントでポインターのアドレス(つまり、ポインターへのポインター)が返されます。

ただし、コンパイルエラーよりもさらに深刻な問題があります。これは未定義の動作であり、クラッシュする可能性が最も高くなります。クラスには、ポインターであるTestStoreメンバー変数があります。bコンストラクターでは、それが指すものに割り当てますが、その時点では実際には何も指しておらず、ランダムメモリを上書きします。

間接参照演算子を使用してポインターが指す場所に割り当てる前にポインターを割り当てるか、ポインターをまったく使用しないでください(私の推奨事項)。

于 2013-03-25T15:18:58.320 に答える