1

我正在尝试重载赋值运算符,如果可以的话,我想清除一些事情。

我有一个非成员函数,bool operator==( const MyClass& obj1, const myClass& obj2 )定义在我的班级之外。

由于显而易见的原因,我无法接触到我的任何私人成员。

所以我认为我需要做的是重载赋值运算符。并在非成员函数中进行赋值。

话虽如此,我认为我需要执行以下操作:

  1. 使用我的功能并使用strcpyor复制信息strdup。我用过strcpy
  2. 转到赋值运算符, bool MyClass::operator=( const MyClass& obj1 );
  3. 现在我们转到函数重载 (==) 并将 obj2 分配给 obj1。

我没有复制构造函数,所以我坚持这些:

class Class
{
private:
m_1;
m_2;
public:
..
};

void Class::Func1(char buff[]) const
{   
    strcpy( buff, m_1 );
    return;
}
void Class::Func2(char buff[]) const
{
    strcpy( buff, m_2 );
    return;
}

bool Class& Class::operator=(const Class& obj)
{ 
    if ( this != &obj ) // check for self assignment.
    {
        strcpy( m_1, obj.m_1 ); 
        // do this for all other private members.
    }
    return *this;
}

bool operator== (const Class& obj1, const Class& obj2)
{
         Class MyClass1, MyClass2;
    MyClass1 = obj1;
    MyClass2 = obj2;

         MyClass2 = MyClass1;
         // did this change anything?
// Microsofts debugger can not get this far.
    return true;
}

因此,您可能会说,我完全迷失在这种超载中。有小费吗?我确实有一个完整的版本重载了相同的运算符,只有::,所以我的私人成员不会失去作用域。我将我的作业返回为 true,它适用于main. 这是我书中的例子。

重载赋值运算符然后在operator==非成员函数中进行转换是否有效?完成该步骤后,我能否在 main 中相互分配对象?

4

4 回答 4

7

您在这里有几个明显的错误,并且对您实际尝试实现的目标有些困惑。首先,赋值运算符operator =旨在将值从一个实例复制到另一个实例。赋值运算符的返回值几乎总是对副本目标的非常量引用,因此您可以链接赋值:

Class & operator=(const Class &rhs)
{
  // copy the members

  return *this;
}

比较运算符operator ==旨在执行两个实例的比较。如果它们相等,则返回布尔值 true:

boolean operator==(const Class &rhs) const
{
  // check if they are equal
  return something;
}

令人困惑的是,您为什么要尝试复制值,或者分配给比较运算符中的实例?

于 2009-04-04T07:02:28.977 回答
6

Op== 不是赋值运算符。T& Op= (const T&) 是。

bool operator==(const T& lhs, const T& rhs) 是比较两个T的操作。如果 lhs 等于 rhs,它返回 true,无论你想编写什么“等于”定义。

于 2009-04-04T06:58:57.627 回答
0

我不确定我是否正确理解了这个问题。但是,如果您尝试使用非成员函数检查相等性并且仅因为您无法访问类的私有成员而不能这样做,那么您可以将非成员函数声明为友元函数并使用它像这样:

class Test
{
public:
    Test(int i) : m_i(i){}
private:
    int m_i;

    friend bool operator==(Test&  first, Test& second);
};

bool operator==(Test&  first, Test& second)
{
    return first.m_i == second.m_i;
}

int main()
{
   Test t1(10), t2(10);
   bool b = (t1 == t2);
}
于 2009-04-04T07:06:27.890 回答
0

我猜你想比较这两个对象。在这种情况下,您可以在“Class”类中重载运算符 ==。您不需要赋值运算符。

    class Class
    {
    public:
        Class(int i) : m_i(i){}

         bool operator==( const Class& rhs)
         {
            return m_i == rhs.m_i;
         }
    private:
        int m_i;

    };


int main()
{
   Class t1(10), t2(10);
   bool b = (t1 == t2);
}
于 2009-04-04T07:42:54.777 回答