假设我有:
class Map {
public:
Map();
vector<Territory>* getTerritories();
};
vector<Territory>* Map::getTerritories()
{
vector<Territory> t;
for (int i = 0; i < 8; i++) {
Territory ter;
ter.setName("Territory " + std::to_string(i + 1));
t.push_back(ter);
}
return &t;
}
现在在另一个课程中,我想获得我在getTerritories()
方法中创建的相同矢量。
Here's how:
void GameSetup::assignTerritories()
{
vector<Territory> * generatedTeritories = (*map).getTerritories(); // dereferenced
}
我没有收到编译器错误,因为它们都是指针。但不知怎的,我似乎无法通过简单的迭代访问我的矢量中的我的Territory对象,就像你通常在矢量上做的那样。
此时,(*map).getTerritories()
获取指向我的区域向量的指针(如果我尝试跟随)。现在假设我要制作一个“alias”某种指针,我要回来了,我该怎么做?是否有可能获得指针的地址?我问自己这个问题并尝试了以下内容:
vector<Territory> * generatedTeritories = &(map->getTerritories());
但这显然不起作用。我不知道还能做什么,而且我一直在圈子里。
答案 0 :(得分:1)
请忘记这里的指针。 getTerritories()
正在返回指向本地对象的指针。函数返回后,此对象将被销毁。您只需要返回该对象,然后在generatedTeritories
变量中找回。
class Map {
public:
Map();
vector<Territory> getTerritories();
};
vector<Territory> Map::getTerritories()
{
vector<Territory> t;
for (int i = 0; i < 8; i++) {
Territory ter;
ter.setName("Territory " + std::to_string(i + 1));
t.push_back(ter);
}
return t;
}
void GameSetup::assignTerritories()
{
vector<Territory> generatedTeritories = (*map).getTerritories(); // dereferenced
}
现在你可以得到这样的矢量地址:
vector<Territory>* addressOfGeneratedTeritories = &generatedTeritories;
但在generatedTeritories
保持活着状态时使用它是唯一安全的(在上面的代码中,它是活着的,直到assignTerritories()
执行结束,因为它是一个本地变量功能)。为了使它持久化,它必须是另一个对象的属性...它将保持活着,直到父对象被销毁......等等。它也可能是一个绝对不推荐的全局变量(它是一种不好的做法,面向对象的设计总是有替代品)。