搜索时,矢量键会丢失

时间:2017-12-09 22:02:07

标签: c++ vector

我的类中有一个向量数组,用于保存指向特定对象指针的指针。

该类应包含允许添加,删除和查找内部对象的方法。 现在这个班级看起来像这样:

class VectorKontener: public Kontener <VectorKontener> {
protected:
    int find(Obiekt &n) {
        cout << endl << "---------------------" << endl << "Running find method loop!" << endl;

        for (int i = 0; i < stos.size(); i++) {
            cout << "Now running for id: " << stos[i]->getId() << endl;
            if (stos[i] == &n) return i;
        }
        return -1;
    }
public:
    VectorKontener::VectorKontener(Obiekt &n) {
        add(n);
    }

    VectorKontener add(Obiekt &n) {
        cout << "Adding: " << n.getId() << endl;

        stos.push_back(&n);

        return *this;
    }

    int checkPresent(Obiekt &n) {
        return this->find(n) != -1;
    }

    VectorKontener remove(Obiekt &n) {
        if (this->checkPresent(n)) {
            stos.erase(stos.begin() + this->find(n));
        }
        else
            cout << endl <<"ELEMENT NOT IN CONTAINER" << endl;

        return *this;
    }

    VectorKontener display() {
        cout << endl << "===DISPLAY===" << endl;
        for (int i = 0; i < stos.size(); i++) {
            stos[i]->display();
        }

        return *this;
    }
};

但是,当运行以下测试数据时:

void Zad3()
{
    Obiekt 
        obj1(5), 
        obj2(23), 
        obj3(234), 
        obj4(33);


    cout << endl << "1. Class init" << endl;
    VectorKontener k1(obj1);

    cout << endl << "2. Adding other objects into array" << endl;

    k1
        .add(obj2)
        .add(obj3)
        .display();

    cout << endl << "3. Element remove attempt" << endl;
    k1
        .remove(obj2)
        .display();

    getchar();
}

输出如下:

1. Class init
Adding: 5

2. Adding other objects into array
Adding: 23
Adding: 234

===DISPLAY===
This object has id: 5
This object has id: 23
This object has id: 234

3. Element remove attempt

---------------------
Running find method loop!
Now running for id: 5
Now running for id: 23

---------------------
Running find method loop!
Now running for id: 5
Now running for id: 23

===DISPLAY===
This object has id: 5

输出使得看起来数组的第三个变量在 find 方法(hehe)中丢失,因为它不是由它计算的,尽管stos.size()显示了正确的值( 2)。

我不是cpp专家,公平地离它很远,并且我知道这可能是一个相当不错的问题,但我确实没有办法让它正常工作。

任何帮助真的很棒

1 个答案:

答案 0 :(得分:1)

问题是函数返回对象的副本,这意味着在链式add调用中原始对象不会被修改(在第二个和任何后续函数调用上),而是在每个函数调用上创建一个临时函数,并在之后立即销毁。

简单的解决方法是将返回值更改为引用,例如:对于add函数:

VectorKontener& add(Obiekt &n) {

而不是

VectorKontener add(Obiekt &n) {

其他功能的类似变化。