C++ 尝试从成员函数中推送时,成员向量不维护元素

C++ 尝试从成员函数中推送时,成员向量不维护元素,c++,vector,C++,Vector,我有一个初始化Object1的静态成员函数,它包含Object2的成员向量。Object2有一个字符串的成员向量 我正在尝试向Object2的向量添加一系列字符串。使用Object2成员函数将字符串推入向量,它不会在每次调用函数时维护元素 例如,在函数内部,每次按下时,它都会打印向量的大小为1,尽管每次都应该增加 我想知道是不是内存分配问题造成了这种情况 向量在类定义中声明,但未在构造函数中初始化 考虑到向量是空的,我不清楚是否有必要在向量中初始化它,如果有,如何初始化 class Object

我有一个初始化Object1的静态成员函数,它包含Object2的成员向量。Object2有一个字符串的成员向量

我正在尝试向Object2的向量添加一系列字符串。使用Object2成员函数将字符串推入向量,它不会在每次调用函数时维护元素

例如,在函数内部,每次按下时,它都会打印向量的大小为1,尽管每次都应该增加

我想知道是不是内存分配问题造成了这种情况

向量在类定义中声明,但未在构造函数中初始化

考虑到向量是空的,我不清楚是否有必要在向量中初始化它,如果有,如何初始化

class Object1 {
    private:
        vector<Object2> container;
}


class Object2 {
    protected:
        vector<string> container2;

    public:
        void add_string(string to_be_added)
        {
            container2.push_back(to_be_added);
            cout << container2.size(); // always prints 1
        }
}


void object1_static_member_function()
{
    Object1 obj1;

    //assume container2 is loaded with values
    for(Object2 obj2 : obj1.container)
    {
        obj2.add_string("test string");
        obj2.add_string("test string2");
        obj2.add_string("test string3");
    }
}
class对象1{
私人:
载体容器;
}
类对象2{
受保护的:
载体容器2;
公众:
无效添加字符串(要添加的字符串)
{
容器2.推回(待添加);
cout只需将(Object2&obj2:obj1.container)的
替换为(Object2&obj2:obj1.container)
即可不修改副本


使用修改后的代码版本显示的程序

#include <vector>
#include <string>
#include <iostream>

using namespace std;

class Object2 {
    protected:
        vector<string> container2;

    public:
        void add_string(string to_be_added)
        {
            container2.push_back(to_be_added);
            cout << container2.size() << endl; // always prints 1
        }
};

class Object1 {
    public:
        Object1(int n) { container.resize(n); }
        void function();
    private:
        vector<Object2> container;
};

void Object1::function()
{
    //assume container2 is loaded with values
#ifdef REF
    for(Object2 & obj2 : container)
#else
    for(Object2 obj2 : container)
#endif
    {
        obj2.add_string("test string");
        obj2.add_string("test string2");
        obj2.add_string("test string3");
    }
}

int main()
{
  Object1 obj1(1); /// modified

  obj1.function();
  obj1.function();
}
使用ref进行编译和执行:

pi@raspberrypi:/tmp $ g++ -pedantic -Wall -Wextra v.cc
pi@raspberrypi:/tmp $ ./a.out
1
2
3
1
2
3
pi@raspberrypi:/tmp $ g++ -pedantic -Wall -Wextra -DREF v.cc
pi@raspberrypi:/tmp $ ./a.out
1
2
3
4
5
6

在(Object2 obj2:obj1.container)的
Object2 obj2
obj1.container
中的
Object2
的副本,并将在循环完成当前迭代后立即丢弃。这不应导致您报告的错误,但给出的示例是生成的代码,无法编译,因此实际诊断和解决问题时不会出现错误sswork不可能。问题很好。如果您选择的名称不包含其他对象的元素,这会有所帮助。命名会使代码变得困难或易于理解。我修改了您的代码,允许在迭代
obj1.container时编译/执行它,无论是否使用引用。请参阅我的回答同意这是问题很明显,解决方案和问题都是乱七八糟的,但是…报告的bug是
cout@user4581301是的,问题本身不清楚(就像其中的代码一样^^),将看到OP反应;-)看起来反应是“oops.就是这样。”@user4581301 hehe显然是:-)