如何重载operator =

时间:2012-06-01 00:11:34

标签: c++ operator-overloading

我试图将赋值运算符作为成员函数重载,以将字符串作为参数,并将其值赋给当前对象A。我在下面的评论中发布了错误。

有人可以告诉我我做错了什么吗?我认为它与参数有关,可能与定义中的代码有关。

我不确定我是否正确宣布,但我宣布它是这样的:

WORD operator=(const string& other);

我的定义如下:

WORD WORD::operator=(const string& other) //<---not sure if I did the parameters Correctly
{
(*this) = other;
return (*this);
}

如果有帮助,这是整个文件:

#include <iostream>

using namespace std;

#pragma once

class alpha_numeric //node
{
   public:
char symbol; //data in node
alpha_numeric *next;//points to next node
};

class WORD
{
   public:
      WORD() : front(0) {length=0;}; //front of list initially set to Null
      WORD(const WORD& other);
      bool IsEmpty();
      int Length();
      void Insert(WORD bword, int position);
      WORD operator=(const string& other); 

   private:
      alpha_numeric *front; //points to the front node of a list
      int length;
};

WORD WORD::operator=(const string& other) //<---not sure if I did the parameters Correctly
{
      (*this) = other;
      return (*this);
}

2 个答案:

答案 0 :(得分:1)

好的2件事:

首先,您缺少复制构造函数的定义,因此不进行编译。 在你的课程中尝试这个(只显示部分实现):

WORD(const WORD& other)
: length(other.length)
{
    // Construct me !
}

其次,赋值运算符是正确的,但在所有控制路径上都是递归的。例如。它无限期地称自己为自己。您可能希望在方法内部分配成员(同样,仅显示部分实现):

WORD WORD::operator=(const string& other)
{
    // Only copy the length, the rest is to be filled
    this.length = other.length;
    return (*this);
}

最后,正如其他人所指出的,您在可执行文件中有相同符号的多个定义。要解决这个问题,你必须确保你的标题只包含一次(#pragma一次应该处理它),但也要将头文件中的所有实现细节都移到源文件中。例如将WORD WORD :: operator =(const string&amp; other)的定义移动到CPP文件。

答案 1 :(得分:1)

错误消息来自链接器;它告诉你它找到了相同功能的多个定义。这是因为你已经在头文件中定义了这个函数,它已被包含在多个源文件中,因此你最终得到了函数的多个定义。