如何重建包含向量的非指针类成员

How to reconstruct non-pointer class member containing vector?

本文关键字:指针 成员 向量 包含 何重建 重建      更新时间:2023-10-16

我遇到了一个奇怪的问题:我无法正确重置(破坏和构造)包含向量的属性。它在尝试访问矢量时会导致分段错误。

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

#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;
}

出于某种原因,我想尽可能避免指针和动态分配。它不太符合我的UML概念。

此外,当使用简单的 int(无向量)时,此代码运行良好。

谢谢。

你的toString()不返回任何内容,所以你的程序有未定义的行为(并且,在实践中,返回随机垃圾,这肯定不是一个有效的std::string对象)。

也许您想改用字符串流?

#include <sstream>
// ...
std::string A::toString() const
{
    std::ostringstream s;
    for (auto i : n)
        s << i << ' ';
    s << 'n';
    return s.str();
}

活生生的例子

通常,最好在打开尽可能多的

警告的情况下进行编译。这肯定会被报告为警告。对于这个特定的警告(no- void函数不返回任何内容),我强烈建议将其视为错误。