繁体   English   中英

如何在定义的相同结构中使用变量?

[英]How to use a variable in the same struct it's defined in?

我正在制作类似流氓的ASCII游戏,并制作了一个名为“ Armor”的结构,我想在该结构中使用name变量来获取任何名称的路径。

struct Armor {
    bool equipped;
    std::string name;

    int getBuff(int buff) {
        std::fstream item;
        std::string line;
        std::string response;
        std::string value;

        item.open("../Data/Items/" + name + ".item", std::fstream::in);
        if (item.fail())
            errorQuit("ERROR: There was a problem loading armor type .ITEM file."); // Error and quit function

        while (!item.eof()) {
            getline(item, line);
            response = split(line, '=', 0); // Splits string
            if (response == "buff" + std::to_string(buff)) {
                value = split(line, '=', 1);
                break;
            }
        }

        item.close();
        return std::stoi(value);
    }

};

然后我这样称呼它:

Armor sword;
    sword.name = "Wooden Sword";
    int buff = sword.getBuff(1);

但这会引发未处理的异常错误。 我对其进行了更改,以便getBuff采用2个参数,即int buff和std :: string itemName。 并将路径中的名称替换为itemName; 然后我尝试这样称呼它:

Armor sword;
    sword.name = "Wooden Sword";
    int buff = sword.getBuff(1, sword.name);

但这会引发相同的错误。

我对为什么不能使用名称变量感到困惑,因为它已经被定义。 我还有其他方法可以使用name变量吗?

我看到您刚刚编辑您的评论以说您已解决问题,但我只想添加其他可能会有所帮助的内容:

没有看到如何errorQuit()的定义,有一个在你的一个潜在的问题getBuff()函数。 如果表达式if (item.fail())计算结果为true,则该函数可能会继续尝试处理数据(除非errorQuit()以某种方式脱离程序或其他原因,这可能不是最佳方法)。

基本上,测试fail()可能会或可能不会提供您在所有情况下所需的行为,具体取决于流状态中设置的位。 实现方式有所不同,但是...如果文件无法打开,则将设置failbit和/或badbit ,但不会设置eofbit getline()将看到错误状态,因此在调用它时不会尝试从流中读取。 但是,这也意味着eofbit将永远不会被设置!

有很多不同的“技术”可以读取文件。 有些人喜欢RAII方法。 其他人喜欢在getline()上循环。 或者,即使您不在乎发生了什么,而只是想知道一切是否正常,甚至可以使用good()来检查错误状态。

无论如何,您可能对该页面上的信息感兴趣: std :: ios_base :: iostate

感谢您的所有帮助,但我自己解决了。

我只是犯了一个愚蠢的错误,像个白痴一样被忽略了。

它正在文件中搜索buff + int(例如buff1),但是有多行包含该单词,所以我猜想把它弄乱了。 我刚刚对if语句进行了调整,它可以按预期工作。

抱歉打扰你!

您的getBuf()函数在某些io操作上失败并引发异常。您不处理异常,因此应用程序会以适当的消息退出。 尝试用try / catch包围对getBuf的调用(将包括添加到iostream和stdexcept中)

try {
  int buff = sword.getBuff(1);
}
catch (const std::exception &e) {
  std::cout << e.what() << std::endl;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM