如何重建包含向量的非指针类成员
How to reconstruct non-pointer class member containing vector?
我遇到了一个奇怪的问题:我无法正确重置(破坏和构造)包含向量的属性。它在尝试访问矢量时会导致分段错误。
这是我的代码(在 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
函数不返回任何内容),我强烈建议将其视为错误。
相关文章:
- 如果基类包含双指针成员,则派生类的构造函数
- C++正确的指针成员初始化
- 是否可以使用智能指针成员设置具有另一个结构的结构?
- 为什么 operator() 处的指针成员不起作用?
- 更改队列指针成员的值需要在 C++ 中出现奇怪的错误
- 如何从另一个嵌套类中调用某个封闭类的嵌套类的函数指针成员的值?
- 结构对象的指针成员在传递给函数时被修改
- 参数的混合值,当我调用指针成员函数时
- 如何正确使用结构的共享指针成员?
- C++:私有类指针成员返回未定义的值
- 在函数中传递带有指针成员的结构是浅拷贝或深拷贝在 C 中
- 包含指针成员的嵌套结构
- 在 c++ 中,为什么 -> 被称为二进制中缀指针成员访问运算符?
- C++ 类指针成员行为奇怪(错误)
- 常量结构的指针成员
- 在类C++指针成员中
- 指针成员未在复制构造函数中初始化
- C++移动拥有指针成员的构造函数
- C++ 包含唯一指针成员变量的类的赋值运算符
- 如何使用 QPoint 指针成员对类进行排队和取消排队