1

这里的简单问题。我在这里用向量处理一些赋值问题。我有一堂课,库存:

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;——我在帖子中的意思更多的是指出“你的迭代器没有错,你只是没有复制正确的东西”)。

而且我还要说,使用 avector<void *>几乎是“以 C 方式使用 C++”。如果不是指向基类的智能指针,您应该至少存储一个指向基类的指针。基类可能是“inventry_item”之类的东西。

(而且我相信xxxx_t类型是为 POSIX 保留的,所以你不应该真正调用你的 types xxxx_t

于 2013-09-07T16:42:17.583 回答
0

我怀疑您的指针算术导致尝试调用 an 上的赋值运算符Inventory,但指针实际上并未指向 an Inventory。(例如,它可能指向delete'd Inventory)如果是这种情况,则vector' 的胆量可能会充满随机垃圾,这可能会导致此类断言失败。

例如,您的调用者可能会做以下道德等价物:

Inventory out;
Inventory* target = nullptr;
*target = out;

这可能会导致此类断言失败。检查调用赋值运算符的代码。

(另请注意,您的赋值运算符不处理对 self 的赋值;但在这种情况下,它只会清除Inventory,而不是导致断言失败)

于 2013-09-07T17:09:30.680 回答