0

我正在使用一个 cstring 函数,该函数应该比较两个字符串 MyString 和 m2 的值。我有#include,所以绝对不是那样。这些是我的错误。

(74) : error C2275: 'MyString' : illegal use of this type as an expression
(74) : error C2660: 'MyString::length' : function does not take 1 arguments
(76) : error C2275: 'MyString' : illegal use of this type as an expression

这是我从中获取的代码。

bool MyString::operator ==(const MyString &m2) const
{
    int temp = 0;

    if (length(MyString) = length(m2)) // 74
    {
        if (strcmp(MyString, m2))  // 76
        {
            temp = 1;
        }
        else
        {
            temp = 2;
        }
    }
    if(temp = 2)
    {
        return "true";
    }
    else
    {
        return "false";
    }
}

对此的任何帮助将不胜感激,谢谢。

4

2 回答 2

9

问题:

  • 返回真或假,而不是“真”或“假”
  • 您正在使用 = 而不是 == 进行比较(您在代码中使用 = 进行两次比较)
  • 要在 C++ 类中引用自己,您需要使用关键字this而不是类名。
  • 第 74 行应该是:

    if (length() == m2.length()) // 74
    
  • strcmp 采用 char* 而不是 MyString。
  • 第 76 行应该是:

    if (strcmp(this->c_str(), m2.c_str()))  // 76
    

在第 76 行,这假定 MyString 类型有一个函数 c_str(),它返回一个指向 char[] 缓冲区的指针,该缓冲区以零结尾。


功能结构:

函数的结构真的很糟糕。考虑更像这样的事情:

bool MyString::operator ==(const MyString &m2) const
{
    if(this->length() != m2.length())
      return false;

    return !strcmp(this->c_str(), m2.c_str()));
}

注意:在上述函数中 this-> 可以省略。

于 2009-03-08T19:41:37.180 回答
2

大多数问题已经得到解决。我只是有一个上面没有写的建议:

使用比较运算符的自由函数形式而不是成员函数:

bool operator == (MyString const &, MyString const &);

如果它依赖于私有数据/成员,您必须将其声明为朋友,但您将获得调用者的对称性。假设(与 std::string 一样)您确实定义了从const char *到您的字符串的隐式转换,那么 == 的成员函数实现不是对称的。成员函数要求左侧是所需类型。编译器不会在比较的左侧执行转换:

// assumes MyString( const char* ) is defined and not explicit
// operator== defined as member function

const char* literal = "hola";
MyString str( "hola" );

if ( str == literal ) {} // correct
if ( literal == str ) {} // compilation error

如果您实现为成员函数,则在第一次测试中,编译器将创建一个未命名的 MyString 并调用转换运算符。在第二次检查中,不允许编译器转换literal为 MyString,因此它永远不会找到您的operator==实现。

如果您将比较作为自由函数提供,那么编译器将在 == 的两侧应用相同的转换规则,代码将编译并正常工作。

通常,这同样适用于其他运算符(不包括必须作为成员函数实现的 operator[] 和 operator=)。使用免费功能版本提供对称性。

于 2009-03-08T20:37:19.717 回答