【问题标题】:Using custom string class as map key value in c++在 C++ 中使用自定义字符串类作为映射键值
【发布时间】:2018-07-22 04:03:26
【问题描述】:

当我尝试使用我的自定义字符串类作为键值时,我看到了这个错误

undefined reference to `operator<(DSString const&, DSString const&)'

我已经重载了

bool DSString::operator< (const DSString& newData){
    bool lessThan = true;
    int counter = 0;
    int dataLetter = 0;
    int newDataLetter = 0;

    //compare each letter of both Strings until they differ,
    while(dataLetter == newDataLetter && counter < this->length){
        dataLetter = static_cast<int>(data[counter]);
        newDataLetter = static_cast<int>(newData.data[counter]);
         //change bool if char of current stirng is greater
        if(dataLetter < newDataLetter)
            lessThan = true;
        else if (dataLetter > newDataLetter)
            lessThan = false;
    }

    return lessThan;
}

【问题讨论】:

  • "我已经重载了
  • 重载的代码是绝对关键的。请edit问题添加。

标签: c++ string dictionary key operator-overloading


【解决方案1】:

您的成员运算符要求左侧(即由this 指针指定的一侧)不是const。在声明中添加const 将解决问题:

bool DSString::operator< (const DSString& newData) const;

您对while 循环的实现不正确:您的运算符返回的值对应于最后的比较结果。一旦发现差异,正确的实现应该返回truefalse;仅当相应位置的字符相同时,循环才应继续。此外,当到达两个字符串中较短的的末尾时,循环应该停止;当this 字符串用完字符时,您当前的实现将停止,当另一个字符串较短时会导致未定义的行为。

Demo.

【讨论】:

  • 这修复了错误,但现在我看到“'operator
  • @Alex 你有同一个操作符的另一个独立实现吗?如果这样做,请删除两个实现之一,因为您只需要其中一个。
  • 就是这样。我之前尝试过的解决方案之一没有被删除。
  • @Alex 太棒了!如果这对您有用,请考虑通过单击左侧的复选标记来接受答案。
  • 我已经对其进行了修改,以确保计数器小于两个字符串的长度以修复您的最后一个建议,但我不确定您的第一部分是什么意思。我理解我的代码的方式是,当我将比较值设置为 0(只要两个字符串都不为空)时,它总是会执行至少一个循环。如果第一个字符不同,则这些值将不同,循环不会重复,然后根据哪个字符具有更高的值返回 true 或 false。我不确定这与“发现差异后立即返回真或假”有何不同;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-28
  • 1970-01-01
  • 2021-10-13
  • 2020-01-15
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
相关资源
最近更新 更多