我无法理解如何正确构建指针向量(我对C ++很新)。我认为以下代码总结了这个问题:
Mok.h
class Mok
{
public:
Mok(int n) : m_num{n}
int getNum() {return m_num}
private:
int m_num;
};
Bar.h
class Bar
{
public:
Bar();
void setTiles();
void printTiles();
private:
std::vector<Mok*> m_tileSet;
};
Bar.cpp
void Bar::setTiles()
{
for (int i = 0; i < 4; ++i)
{
m_tileSet.push_back(&Mok(i));
}
}
void Bar::printTiles()
{
for (const auto &mok : m_tileSet)
{
std::cout << mok->getNum() << " ";
}
}
这个想法是打印存储在矢量中的数字,但我得到了疯狂的数字(我知道它对于整数没有多大意义,真正的代码更复杂,这是一个简化。想象莫克如一个大对象,以及包含数千个对象的向量)。在 setTiles()内部,所有内容似乎都存储正常(VS调试器这样说),但是当我到达 printTiles()时,信息丢失了,我得到的数字如< EM> -858993460
我猜Mok对象超出范围,所以引用(编辑:我的意思是地址)开始指向哪里?这样做的方法是什么?
谢谢! :)
答案 0 :(得分:0)
Sam和Chris在评论中建议,一种方法是避免使用指针。以下代码有效:
<强> Mok.h 强>
class Mok
{
public:
Mok(int n) : m_num{n}
int getNum() {return m_num}
private:
int m_num;
};
<强> Bar.h 强>
class Bar
{
public:
Bar();
void setTiles();
void printTiles();
private:
std::vector<Mok> m_tileSet;
};
<强> Bar.cpp 强>
void Bar::setTiles()
{
for (int i = 0; i < 4; ++i)
{
m_tileSet.push_back(Mok(i));
}
}
void Bar::printTiles()
{
for (auto &mok : m_tileSet)
{
std::cout << mok.getNum() << " ";
}
}
保持指针,使用 std :: unique_ptr (感谢评论中的n.m.):
<强> Bar.h 强>
class Bar
{
public:
Bar();
void setTiles();
void printTiles();
private:
std::vector<std::unique_ptr<Mok>> m_tileSet;
};
<强> Bar.cpp 强>
void Bar::setTiles()
{
for (int i = 0; i < 4; ++i)
{
m_tileSet.push_back(std::make_unique<Mok>(i)); // C++14
//m_tileSet.push_back(std::unique_ptr<Mok>(new Mok(i))); // Previous to C++14
}
}
void Bar::printTiles()
{
for (auto &mok : m_tileSet)
{
std::cout << mok->getNum() << " ";
}
}