【问题标题】:Array of classes won't hold new value [closed]类数组不会保存新值[关闭]
【发布时间】:2014-06-10 17:27:54
【问题描述】:

好的,所以我正在尝试从文件中解析信息,并且我有这个循环读取未知数量的 5 个数字字符串,这些字符串由新行分隔。 ProfDB 只是一个包含教授类对象的数组。该类有一个方法 (addPrevCourse()),可将 Course 对象添加到该类中的课程数组中。 CRNDictionary 是一个函数,它接受一个字符串并基于该字符串返回一个课程对象。这是sn-ps的代码:

主要:

ifstream in;
in.open("File.txt");

string CRNHash = "";
while (CRNHash != "!ENDLIST"){
     in >> CRNHash;
     (*ProfDB[used]).addPrevCourse(CRNDictionary(CRNHash));

添加上一课:

void Professor::addPrevCourse(const Course& newCourse)
{
    int i = 0;
    while (i < 8){
        if (Courses_Taught[i].getCRN() == "0"){
            Courses_Taught[i] = newCourse;
        }

        i++;
    }
}

CRN字典:

Course CRNDictionary(string CRN){
//search course list for the crn passed, temp implementation
    if (CRN == "12345")
        return Course("Test", "12344");
    else if (CRN == "13254")
        return Course("Test2", "13254");
    else
        return Course("Test2", "BLAH");
}

问题是当我运行程序并打印教授的数组(其中包含 5 个字符字符串)时,所有值都显示为 12344(来自 CRNDictionary 的第一个对象),即使文件有 5 个不同的值.我已经验证 CRNHash 被正确扫描,但无法弄清楚为什么添加到数组中的值不会改变。

【问题讨论】:

  • 什么是ProfDB,它是如何声明的,如何初始化的?
  • 另请注意,您的阅读循环会将"!ENDLIST" 添加为课程。您可能需要重新考虑一下逻辑。
  • 另外(我认为它更相关),Course 类是如何定义的。
  • 相关:将该条件更改为:(in &gt;&gt; CRNHash &amp;&amp; CRNHash != "!ENDLIST"),将提取移至条件检查。现在它没有被检查(这不会很顺利)。您也可以将素数丢失为空字符串。新的条件没有意义。
  • 您没有展示足够多的代码。最有可能的是,getCRN() 总是返回 0 和/或您将相同的值存储到所有 8 个 arra 位置。

标签: c++ arrays class variable-assignment


【解决方案1】:

这是因为在addPrevCourse 的第一次传递之后,所有数组项都被第一个输入填充,导致该函数内的if 在接下来的传递中始终为false。您需要做的是,当条件为true 时,在while 中添加一个break,或者在Professor 中保留一个成员计数器以了解下一个空数组单元格。

【讨论】:

  • 确实你是对的,很好发现:) - 丢失的break 肯定需要修复。然而,他是否应该循环的事实仍然无关紧要:P
  • @BartoszKP 我想我误解了你不相关的评论:)。但这是一个很好的例子,低效率如何导致不正确。
  • 谢谢。我玩了好几个小时都找不到这个哈哈我知道问题出在这些街区的某个地方。
猜你喜欢
  • 2013-10-12
  • 2015-10-31
  • 2013-02-22
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多