2012-06-01 125 views
0

我想重載賦值運算符作爲成員函數將字符串作爲參數並將它的值分配給當前對象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

錯誤錯誤LNK2005:「public:class WORD __thiscall WORD :: operator =(class std :: basic_string ,class std :: allocator > const&)」(?? 4WORD @@ QAE?AV0 @ ABV?$ basic_string @ DU?$ char_traits @ D @ std @@ V?$ allocator @ D @ 2 @@ std @@@ Z)已經在word.obj中定義了\t C:\ Users \ Mike \ Desktop \ School Programs \ Data Structures Assignment 2 \ Data Structures Assignment 2 \ word_driver.obj – Mike

+0

Error error LNK2019:無法解析的外部符號「public:__thiscall WORD :: WORD(class WORD const&)」(?? 0WORD @ (class @ std :: char_traits ,class std :: allocator > const&)「((@ QAE @ ABV0 @@ Z)在函數」public:class WORD __thiscall WORD :: operator =(class std :: basic_string Mike

回答

1

好了兩件事情:

首先你錯過了你的拷貝構造函數的定義,所以這不是編譯。 試試這個類(只顯示部分實現)內:

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 & other)的定義移動到CPP文件。

+0

所以如果我這樣做,這是說,A中字母的長度現在將與字符串中字母的長度相同?如果是這樣,Will也會讓A =字符串是什麼? – Mike

+0

部分地,它只會複製長度成員。您需要實施其他成員的複製,例如正面。例如,如果你想做一個淺拷貝(只複製指針),你可以這樣做:this.front = other.front ;.請注意,這不會成爲真正的副本。爲此,您需要製作alpha_numeric類的深層副本。 –

+2

prgama不會解決鏈接器錯誤。 –

1

錯誤消息來自鏈接器;它告訴你它找到了同一個函數的多個定義。這是因爲您已經在頭文件中定義了函數,該函數已包含在多個源文件中,因此您已經定義了函數的多個定義。

+0

多重定義可以通過將函數的定義移動到源文件或者定義'inline'來解決(但只能執行其中的一個,而不是兩個!) –