我试图在for循环中打印vector<string>
的内容。我有一个类,它的方法可以将值插入vector<string>
并返回它。然后我使用for循环打印内容。
相关代码如下:
class MyClass {
vector<string> fizz_buzz (const int max) {
vector<string> v1;
const auto it = v1.begin();
for (int i = 1; i <= max; i++) {
if (i % 5 == 0 && i % 3 == 0) {
v1.insert(it, "FizzBuzz!");
} else if (i % 5 == 0) {
v1.insert(it, "Buzz");
} else if (i % 3 == 0) {
v1.insert(it, "Fizz");
} else {
v1.insert(it, to_string(i));
}
}
return v1;
}
};
int main() {
// MyClass my_class;
MyClass* ptr1 = nullptr;
const auto v1 = ptr1->fizz_buzz(100);
for (const string &s : v1) {
cout << s << "\n";
}
delete ptr1;
return 0;
}
字符串
我希望有这样的输出:
1
2
Fizz
4
Buzz
Fizz
...
型
相反我一无所有
我怀疑问题是我的指针是空的,但我不知道为什么。
2条答案
按热度按时间ijxebb2r1#
你通过一个
nullptr
对象指针在一个无效的MyClass
对象上调用fizz_buzz()
,这是一种 * 未定义的行为 *。你甚至根本不需要这个对象,因为它不包含任何fizz_buzz()
正在使用的数据。修复后,
fizz_buzz()
是private
,所以你的main()
不能调用它。你需要把它改为public
。修复此问题后,您将在空
vector
上调用vector::begin()
(实际上返回vector::end()
迭代器)并将其保存在it
变量中,但每次调用vector::insert()
时都不会更新it
。插入操作使it
无效,要在vector
后面插入,每次都需要调用vector::end()
fresh,或者只使用vector::push_back()
。试试这个:
字符串
Demo
dgtucam12#
第一个问题:
fizz_buzz
是类的私有成员,所以你的程序无法编译。第二个问题:你试图解引用一个nullptr
来调用fizz_buzz
,所以即使我们修复了隐私问题,你的代码也有未定义的行为。在我的系统上,它会发生segfaults。你不需要这个类,因为这个类不管理
fizz_buzz
函数需要访问的任何状态。摆脱它。只需编写一个函数fizz_buzz
。然后在你的vector中使用push_back
,而不是试图在开头插入。字符串
在
main
中:型