我试图将赋值运算符作为成员函数重载,以将字符串作为参数,并将其值赋给当前对象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);
}
答案 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)
错误消息来自链接器;它告诉你它找到了相同功能的多个定义。这是因为你已经在头文件中定义了这个函数,它已被包含在多个源文件中,因此你最终得到了函数的多个定义。