C++:第一个函数创建一个对象,然后第二个函数把这个对象作为一个参数-怎么做?

u4dcyp6a  于 2023-03-05  发布在  其他
关注(0)|答案(2)|浏览(123)

好吧,我知道我的标题是非常不清楚,但我认为部分问题是,我不知道如何解释清楚,足以谷歌是有用的。
基本上我有两个功能:

SentenceData parseSingleSentence(std::string inputString)
    {
        SentenceData actualSentenceData;

        actualSentenceData.transmitter = inputString.substr(1, 2);
        actualSentenceData.format = inputString.substr(3, 3);

        // Data fields run from first ',' (index 7) and the last 3 characters can be disregarded
        std::stringstream ss(inputString.substr(7, inputString.length()-10));
        std::string newDataField;
        while (!ss.eof()) {
            getline(ss, newDataField, ',');
            actualSentenceData.dataFields.push_back(newDataField);
        }

        return actualSentenceData;
    }

    bool hasCorrectNumberOfFields(SentenceData sentenceData)
    {
        std::map<std::string, int>::iterator iterator = supportedFormats.begin();
        while (iterator != supportedFormats.end())
        {
            if (sentenceData.format == iterator->first && int(sentenceData.dataFields.size()) == iterator->second) return true;
            ++iterator;
        }

        return false;
    }

在main()中,我想运行:

parseSingleSentence(inputString);
    if (!hasCorrectNumberOfFields(actualSentenceData)) continue;

然而,有一个明显的问题-编译器没有识别出在调用parseSingleSentence()之后将返回的actualSentenceData。
错误为:376:43:使用了未声明的标识符"actualSentenceData"
我原本希望编译器能识别出第一个函数返回的变量,当它抛出错误时,我很快意识到了问题所在,但不知道解决方案是什么。
有什么办法可以解决这个问题吗?我已经花了几个小时试图找出我错过了什么,不知道从这里去哪里。
我在Google和Stack Overflow上搜索过。另外浏览了几个C++网站,看了一些教程,还有我大学的讲座。

oyxsuwqo

oyxsuwqo1#

您需要在另一个变量中 * 捕获 * 返回值(您可以随意命名它,这里我称它为sd)。

SentenceData sd = parseSingleSentence(inputString);
if (!hasCorrectNumberOfFields(sd)) continue;

局部变量只存在于声明它们的函数中,return不会改变这一点。从函数返回的是一个 * 值 * 而不是变量。如果你想保存那个值,你需要另一个变量。

vzgqcmou

vzgqcmou2#

我猜你的意思是这样的

SentenceData data = parseSingleSentence(inputString);
if (!hasCorrectNumberOfFields(data)) { 
  continue;
}

此外:
1.它被认为是减少变量范围的好方法,所以如果你使用现代C++标准,你可以选择使用以下代码:

if (auto data = parseSingleSentence(inputString); !hasCorrectNumberOfFields(data)) {
  continue;
}
  1. hasCorrectNumberOfFields中的参数是传值的,如果SentenceData有移动构造函数,u最好使用const&或者传值,调用时使用std::move(data)
    1.最好将while循环替换为range-based-for
bool hasCorrectNumberOfFields(SentenceData sentenceData) {
  for (const auto& [format, fields]: supportedFormats) {
    if (sentenceData.format == format && 
        (int)sentenceData.dataFields.size() == fields) 
    { 
       return true;
    }
    return false;
}

相关问题