【发布时间】:2014-02-10 21:33:38
【问题描述】:
我大部分时间都在使用托管代码进行编程,并且我有兴趣回到 C++。 一直在到处敲我的头(在谷歌上)寻找答案。 所以我开始在这里做练习:http://www.cplusplus.com/forum/articles/12974/ 并偶然发现了很多错误。 我尝试了可乐机(第二台),它给了我制作可乐机的想法,并尝试用 pointers 的 初始化 Machine 中的列表喝。
我不想使用 Boost 库,因为我想了解容器的工作原理(尤其是列表)。
我会在问题之后发布我的代码:
1) 我在(*it)->getDrinkName() 行中收到以下错误
EXC_BAD_ACCESS 关于方法:getDrinkName() in Drink.cpp 为什么会这样?我没有用饮料正确初始化列表吗?
当我尝试这个时:
Drink* test = new Drink("Coke");
cout << test->getDrinkName();
它有效。是我在 Drink 中的构造函数让它崩溃了吗?
2) 我想在 Machine 的构造函数中初始化列表吗?喜欢:
_list = new list<Drink *>();
3) 这是代码:
Drink.h
#include <iostream>
#include <string>
using namespace std;
class Drink
{
public:
Drink(string name);
string getDrinkName();
private:
string _name;
};
Drink.cpp:
#include "Drink.h"
Drink::Drink(string name)
{
_name = name;
}
string Drink::getDrinkName()
{
return _name;
}
机器.h
#include <iostream>
#include <list>
#include "Drink.h"
using namespace std;
class Machine
{
public:
Machine();
list<Drink*> getList() const;
private:
list<Drink*> _list;
};
机器.cpp:
#include "Machine.h"
Machine::Machine()
{
}
list<Drink*> Machine::getList() const
{
return _list;
}
main.cpp
#include <iostream>
#include <string>
#include "Machine.h"
using namespace std;
int main () {
Machine* machine = new Machine();
Drink* testCoke = new Drink("Coke");
machine->getList().push_back(testCoke);
std::list<Drink*>::const_iterator it ;
for(it = machine->getList().begin();it!=machine->getList().end();it++)
{
cout << (*it)->getDrinkName();
delete *it;
}
return 0;
}
提前谢谢!
【问题讨论】:
-
哎呀,我忘记删除了,我在这里添加了它!谢谢。我知道我可以像他们使用的所有教程一样取出所有动态分配,如 list
... 但我想将指针放在列表中,然后最终使用 boost,但现在我想知道它为什么会崩溃那个地方。 -
@juanchopanza 虽然我同意他应该避免动态分配,但这不是问题的根源,这是迭代器范围的问题。
-
@bachibusuc 添加
delete只会让代码变得更糟。真正退后一步,从一本好的 C++ 书籍开始。 -
<rant>伙计们,不管指针是个好主意还是坏主意,C++ 初学者都必须知道它们是如何工作的,因为在没有智能指针的情况下开发的代码已经有 40 多年了.每当您看到指针时,简单地将问题记为指针不仅没有帮助,而且也不能教人们如何正确使用指针,而且通常是卑鄙的。</rant> -
@pmr 我想我可以使用这个解决方案:stackoverflow.com/a/307121/2081433