C++ 如何重构包含向量的非指针类成员?

C++ 如何重构包含向量的非指针类成员?,c++,c++11,vector,constructor,segmentation-fault,C++,C++11,Vector,Constructor,Segmentation Fault,我面临一个奇怪的问题:我无法正确重置(析构函数和构造)包含向量的属性。当尝试访问向量时,它会导致分段错误 这是我的代码(C++11中的witten)。我想我尽可能地简化了它来强调这个问题,但我可能错了,对此表示抱歉。 目标是将两个不同(随机)向量打印两次。第一个向量运行良好,第二个向量由于未知原因完全失败 #include <iostream> #include <ctime> #include <cstdlib> #include <vector>

我面临一个奇怪的问题:我无法正确重置(析构函数和构造)包含向量的属性。当尝试访问向量时,它会导致分段错误

这是我的代码(C++11中的witten)。我想我尽可能地简化了它来强调这个问题,但我可能错了,对此表示抱歉。 目标是将两个不同(随机)向量打印两次。第一个向量运行良好,第二个向量由于未知原因完全失败

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <vector>

class A
{
        std::vector<int> n;

    public :
        A();
        std::string toString() const;
};

A::A()
{
    for (int i = 0; i < 10; i++)
        n.push_back(std::rand()%10);
}

std::string A::toString() const
{
    for (auto i : n)
        std::cout << i << ' ';
    std::cout << std::endl;
}

class B
{
        A a;

    public :
        void resetA();
        A getA() const;
};

void B::resetA()
{
    a = A();
}

A B::getA() const
{
    return a;
}

int main()
{
    srand(time(NULL));

    B b;
    std::cout << b.getA().toString();
    b.resetA();
    std::cout << b.getA().toString();


    return EXIT_SUCCESS;
}
#包括
#包括
#包括
#包括
甲级
{
std::向量n;
公众:
A();
std::string toString()常量;
};
A::A()
{
对于(int i=0;i<10;i++)
n、 向后推(std::rand()%10);
}
std::string A::toString()常量
{
用于(自动输入:n)
std::cout您的
toString()
不返回任何内容,因此您的程序具有未定义的行为(并且,在实践中,返回的随机垃圾肯定不是有效的
std::string
对象)

也许您想使用字符串流来代替

#include <sstream>

// ...

std::string A::toString() const
{
    std::ostringstream s;
    for (auto i : n)
        s << i << ' ';
    s << '\n';
    return s.str();
}
#包括
// ...
std::string A::toString()常量
{
std::ostringstream s;
用于(自动输入:n)

s@Cyber std::vector不需要调整大小。push_back会动态地增长向量。事实上,调整大小会使他的向量在开始时有20个项目长,10个未初始化的值。你的意思是保留,但这也是错误的。你是对的,这解决了描述的问题。我的错误。但是,非简化程序unf中的问题很幸运来自Elswere。谢谢。