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

Posted

技术标签:

【中文标题】如何重建包含向量的非指针类成员?【英文标题】:How to reconstruct non-pointer class member containing vector? 【发布时间】:2014-02-24 18:15:09 【问题描述】:

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

这是我的代码(用 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(无向量)时运行良好。

谢谢。

【问题讨论】:

@Cyber​​ std::vector 不需要调整大小。 push_back 动态增长向量。事实上,resize 会使他的向量长 20 项,一开始有 10 个未初始化的值。你的意思是说保留,但这也是错误的 【参考方案1】:

您的 toString() 不返回任何内容,因此您的程序具有未定义的行为(实际上,返回的随机垃圾肯定不是有效的 std::string 对象)。

也许您想改用字符串流?

#include <sstream>

// ...

std::string A::toString() const

    std::ostringstream s;
    for (auto i : n)
        s << i << ' ';
    s << '\n';
    return s.str();

Live example.

一般来说,编译时打开尽可能多的警告是个好主意。这肯定会被报告为警告。对于这个特定的警告(no-void 函数没有返回任何内容),我强烈建议将其视为错误。

【讨论】:

你是对的,这解决了所描述的问题。我的错。然而,不幸的是,非简化程序中的问题来自其他地方。谢谢。

以上是关于如何重建包含向量的非指针类成员?的主要内容,如果未能解决你的问题,请参考以下文章

从类指针向量创建成员变量向量

如何将具有指向 QML 的指针成员的非 QObject 类公开?

指向任何类类型的非静态成员函数的 C++ 函数指针

C++从类的向量指针访问类的成员

C++ 固定数量的向量大小作为类成员

如何使用智能指针跟踪类的对象?