【问题标题】:Why does my vector not update with the changes I make to its elements? [duplicate]为什么我的向量没有随着我对其元素所做的更改而更新? [复制]
【发布时间】:2019-11-12 19:52:41
【问题描述】:

我有一个类,它使用向量来存储一组具有无符号长整数的对象。该类的操作之一是通过将元素与另一个 u_long 进行 OR-ing 来更改存储的元素 u_long。

如果我在执行 OR 后立即cout,则表明号码已更改。但是,如果我返回并 cout 向量中的元素,则不会显示进行了任何更改。我在这里错过了什么?

类定义

class ULBox {
public:
    ULBox(std::string s) {
        label = s;
    };

    ~ULBox(){};

    std::string getLabel(){
        return label;
    };

    void setNumber(unsigned long n) {
        number |= n;
    };

    unsigned long getNumber(){
        return number;
    }

private:
    std::string label;
    unsigned long number;
};

class BoxList {
public:
    BoxList() {};
    ~BoxList() {};

    bool addBox(std::string label) {
        ULBox newBox(label);
        boxes.push_back(newBox);
        return true;
    };

    bool updateBoxNums(unsigned long num) {
        int i = 1;
        for(auto box: boxes) {
            box.setNumber(num+i);
            std::cout << box.getNumber() << std::endl;
            i++;
        };
        return true;
    };

    void printBoxes() {
        for(auto box: boxes) {
            std::cout << box.getLabel() << ": " << box.getNumber() << std::endl;
        };
    };

private:
    std::vector<ULBox> boxes;
};

主要功能

int main(void) {
    BoxList b_list;

    b_list.addBox("first");
    b_list.addBox("second");
    b_list.addBox("third");

    b_list.updateBoxNums(2);

    b_list.printBoxes();

};

输出 output displaying 3, 4, 5 and then 0s where there should be another 3, 4, 5

【问题讨论】:

    标签: c++ oop std


    【解决方案1】:

    当你使用时

    for(auto box: boxes) {
        box.setNumber(num+i);
        std::cout << box.getNumber() << std::endl;
        i++;
    };
    

    boxboxes 中项目的副本。它不是对boxes 中的项目的引用。之后您只是在修改副本。使用auto&amp; box

    for(auto& box: boxes) {
        box.setNumber(num+i);
        std::cout << box.getNumber() << std::endl;
        i++;
    }
    

    【讨论】:

    • 谢谢!这是一个巨大的头痛。我想我应该回去研究一下远程规范。
    • @AlexMozeak,它是 auto 和 range-for 循环的组合。
    【解决方案2】:

    您没有通过引用循环。那是因为auto 永远不是参考,除非您明确将其设为参考。因此,如果您打算编辑正在循环的实际项目,则需要通过参考进行。这意味着像这样的代码:

    auto box: boxes
    

    应该是:

    auto& box: boxes
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-12
      • 1970-01-01
      相关资源
      最近更新 更多