我使用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";
}
}
对此表示感谢,谢谢。
答案 0 :(得分:9)
<强>问题:强>
第74行应该是:
if (length() == m2.length()) // 74
第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()));
}
注意:在上述功能中,这个 - >可以省略。
答案 1 :(得分: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 =必须实现为成员函数)。使用自由函数版本提供对称性。