gpt4 book ai didi

c++ - 代码行在两行之后不起作用

转载 作者:太空狗 更新时间:2023-10-29 20:43:58 28 4
gpt4 key购买 nike

这令人费解。我需要在我的程序中使用函数 CCountry::getName()。奇怪的是,当测试它是否完全起作用时,它在一个地方起作用,但在两行之后不起作用,我不明白为什么。例如……

while(line != "---" && line != "------")
{
CCountry *tempCountry = new CCountry(line);
cout << tempCountry->getName() << flush;
(*tempContinent).addCountry(*tempCountry);
getline(filestr, line);

}

有效。它按顺序列出所有国家名称。然而……

    while(line != "---" && line != "------")
{
CCountry *tempCountry = new CCountry(line);
(*tempContinent).addCountry(*tempCountry);
getline(filestr, line);
cout << tempCountry->getName() << flush;
}

不起作用。它甚至无法打印一个国家/地区名称,而是在调用 getName() 的行中抛出一个段错误。

这里有两个函数 getName() 和 addCountry() 供进一步引用

string CCountry::getName()
{
return *name;
}

void CContinent::addCountry(CCountry country)
{
(*countries).push_back(country);
}

根据请求,这是 CCountry 构造函数:

CCountry::CCountry(string in_name)
{
name = new string;
*name = in_name;
player = new int;
*player = -1;
units = new int;
*units = 0;
neighbors = new list<CCountry>;
}

最佳答案

我可以列出一长串关于这段代码的错误,但导致你错误的最终原因如下:

您的 CCountry 类没有练习 Rule of 3 ,它必须因为它有动态分配的成员。(顺便说一句,甚至不需要)。

您正在通过按值获取国家/地区的成员函数将 CCounty 对象添加到您所在的大陆。对象的浅拷贝是在那时制作的。然后将其插入大陆内的容器中,这会生成另一个浅表拷贝。在 addCountry() 退出时,原始的浅拷贝被销毁,并且在您返回调用代码的过程中,CCountry 对象的内部已经被销毁。因此,您的本地(顺便说一下,它不应该动态分配到第一位)被正式清理了。

你猜怎么着……大陆容器中的那个也是。

我可能会首先考虑 CCountry 对象本身。就个人而言,我会在 CContinent 类而不是 CCountry 中管理 CCountry 的邻居,因为 CCountry 对象的集合无论如何都在这里管理,但每个对象都是自己的。如果您决定坚持使用当前模型,CCountry 的潜在替代方案可能是这样的:

class CCountry
{
public:
CCountry(const std::string& name)
: name(name), player(0), units(0)
{
}

// properties
const std::string& getName() const { return name; };
int getPlayer() const { return player; };
void setPlayer(int player) { this->player = player; };
int getUnits() const { return units; };
void setUnits(int units) { this->units = units; };

// neighbor access
const std::list<const CCountry*> getNeighbors() const
{
std::list<const CCountry*> res;
for (auto it=neighbors.begin(); it != neighbors.end(); ++it)
res.push_back(it->second);
return res;
}

// adding a new neighbor
void addNeighbor(const CCountry& other)
{
neighbors[ other.getName() ] = &other;
}

private:
std::string name;
int player;
int units;
std::map<std::string, const CCountry*> neighbors;
};

但请注意:追求这样的模型(如您所见,您的原始模型)将有潜在的缺陷,特别是一个 CCountry 可能有指向另一个 CCountry 的指针,而技术上它没有'拥有。这就是为什么我更喜欢邻居协会由 CContinent 类本身管理,因为它会同时拥有 CCountry 和他们的邻居协会。

关于c++ - 代码行在两行之后不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14086561/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com