1

ここで簡単な問題。ここでは、ベクトルを使用した代入の問題を少し扱っ​​ています。私は1つのクラス、Inventoryを持っています:

class Inventory
{
public:
    __inline void operator=( const Inventory& rtSide )
    {
        items.clear();
        for(auto it=rtSide.items.begin(); it!=rtSide.items.end(); ++it)
        {
            items.push_back(*it);
        }
    }
private:
    std::vector<void*> items;
}

クラスを含む構造体があります:

typedef struct
{
    Inventory *inventory;
} player_t;

player_t のポインターでポインター演算を割り当て/実行すると、予想どおり、Inventory の = オーバーロードが呼び出されます。ただし、MSVC を使用すると、アサーション エラー、具体的には「互換性のないベクトル イテレータ」があるように見えます。奇妙なことに、これは clear() で発生します。ここで何が起こっているのかわかりません。誰かが私に何か助けてくれたら、それは素晴らしいことです。

何が起こっているかの例を次に示します。ポインター演算を使用して、ベースから現在のクライアントのプレーヤー構造を差し引くことで、クライアント番号を決定できます。

clientNum = newcl - svs.clients;

これが特に私が主張する原因です。

4

2 に答える 2

0

rtSideのアイテムではなく、リストからアイテムをコピーしたいはずthisです。

    items.clear();
    for(auto it=rtSide.items.begin(); it!=rtSide.items.end(); ++it)
    {
        items.push_back(*it);
    }

(もちろん、独自のoperator=.items = rtSide.items;あなたは正しいものをコピーしていないだけです」)。

vector<void *>また、a を使用することは、ほとんど「C++ を C の方法で使用する」ことだとも言えます。基本クラスへのスマート ポインターでない場合は、少なくとも基本クラスへのポインターを格納する必要があります。Baseclass は、「inventry_item」などのようなものです。

(そして、xxxx_tタイプはPOSIX用に予約されていると思うので、実際にタイプを呼び出すべきではありませんxxxx_t

于 2013-09-07T16:42:17.583 に答える