2011-07-18 101 views
2

Possible Duplicate:
Operator overloading創建用C類賦值(=)運算符++

EDIT 2

我用刀片(...)不正確,我沒有實際需要 '=' 運算符。抱歉浪費人們的時間。我已投票結束..仍然有2票。請投票。

EDIT

我想要一個「=」操作符是這樣我可以使用插入物(...)函數上推導對象的矢量的原因。此刻我的編譯器說:

/usr/include/c++/4.2.1/bits/stl_algobase.h:283: error: no match for 'operator=' in '* __result = * __first'

我創建「==」和「<」爲我自己的類運營商之前,但我竭力要打造一個「=」運算符。我的階級是這樣的(忽略傻變量名):

class Derivation { 
public: 
    string     rc; 
    ImplementationChoice Y; 
    vector<Derivation>  X; 
    vector<string>   D;  
    vector<string>   C;  
    vector<Player>   P, O; 
    vector<Attack>   B; 

    // various functions 
    // ... 
}; 

,我想知道我需要把

// What do '=' return? An object of the class right? 
Derivation& operator=(const Derivation &d) const { 
    // something.... 
} 

非常感謝。

+2

最起碼,它應該返回一個引用('推導&'),而不是對象的新副本。 :) – jalf

+0

謝謝..現在編輯帖子。對不起。對C++來說很新穎 – ale

+2

我建議你閱讀[運算符重載常見問題](http://stackoverflow.com/q/4421706/46642)。 –

回答

0

重載賦值運算符,你應該這樣做

Derivation& operator=(const Derivation &d) { 
    // something.... 
    return *this 
} 

這將允許你做這樣的事情。

偏差a,b,c; //東西

c = b = a;

+0

我不認爲它應該是一個常量方法,因爲你正在改變對象的狀態(分配它)的值。這可能是合法的C++,但並不合理。 – Skizz

+0

@Martinho和@Skizz。謝謝,我已編輯 – Leon

+0

謝謝..我基本上有一個參數(const Derivation&d)來自我的代碼中其他地方的'<'運算符粘貼。我可以刪除該權利?謝謝。 – ale

2

這取決於你,真的。你需要運營商做什麼?你想返回一個參考,還是你想要一個副本?

編輯:請注意,這是修辭。你使用這個矢量將決定你是否需要一個引用或一個副本。例如,如果插入的對象在從矢量中移除之前就會超出範圍,那麼您需要一個副本。如果不是,並且希望在更改向量中的實例時生成原始對象,則需要引用。希望有點幫助。

+0

請這麼編輯後。我需要'='運算符,因此我可以在Derivation對象的矢量 – ale

+0

上使用insert(...)...我很抱歉,什麼? – MGZero

+0

我希望能夠這樣做: 'vector d;' 'd.insert(d.end(),vec.begin(),vec.end());' – ale

0

自 - @jalf尚未提出了一個答案,這裏是:)

Derivation& operator=(const Derivation &d) { 
    // something.... 
    return *this; 
} 

你需要一個參考返回這個實例。 this是一個關鍵字,它包含一個指向操作員所在實例的指針。

2

先刪除常量... 然後如果你真的需要一個拷貝操作,做這樣的事情,並添加自己的邏輯(所以它不會做到這正是將與編譯器生成的拷貝操作來完成):

Derivation& operator=(const Derivation& other) { 
    this->rc = other.rc; 
    this->Y = other.Y; 
    this->X = other.X; 
    this->D = other.D;  
    this->C = other.C;  
    this->P = other.P; 
    this->O = other.O; 
    this->B = other.B; 
    // ... 
    return *this; 
} 
+2

除了這是***正是***編譯器生成的複製賦值運算符所做的...... –

+0

@Armen - 真的嗎?我沒有意識到編譯器生成的賦值運算符也會調用'vector'成員的賦值? – Nim

2

首先,賦值運算符可能不應該const--

其次,賦值運算符通常會返回一個非const引用到被分配一個值(*此)

2

你並不需要一個對象。編譯器生成的將會很好。

+0

這取決於如何實施ImplementChoice,Player和Attack ... – rlods

+0

真的嗎?在這個'struct'中有五個'vector's ​​... – Nim

+0

請這麼編輯在後。我需要'='運算符,因此我可以在Derivation對象的矢量上使用insert(...)。沒有一個就不能編譯。它說'/usr/include/c++/4.2.1/bits/stl_algobase.h:283:錯誤:在'* __result = * __first'''中不匹配'operator =' – ale

1

實現賦值運算符的標準方法是複製和交換。 這樣做的好處在於,可以使得賦值運算符在異常和自賦值時正確無誤。它還根據複製構造函數定義了賦值操作,因此如果向該類添加額外成員,則可以減少代碼需要更改的位置數。

反正 - 這裏是什麼樣子,你的情況:

class Derivation { 
    public: 
    string     rc; 
    ImplementationChoice Y; 
    vector<Derivation>  X; 
    vector<string>   D;  
    vector<string>   C;  
    vector<Player>   P, O; 
    vector<Attack>   B; 

    //You need to add a swap function to your class 
    void swap(Derivation& o) { 
     rc.swap(o.rc); 
     Y.swap(o.Y);//Assuming ImplementationChoice has a swap function (it should!) 
     X.swap(o.X); 
     D.swap(o.D); 
     C.swap(o.C); 
     P.swap(o.P); 
     O.swap(o.O); 
     B.swap(o.B); 
    } 
    Derivation& operator=(Derivation const& o) { 
     Derivation copy(o); 
     copy.swap(*this); 
     return *this; 
    } 
    // various functions 
    // ... 
}; 
+0

謝謝Mankarse。你在我的帖子中看到過我的編輯嗎?如果我想在我的Derivation對象的矢量上使用矢量插入(...)函數,這是我需要的嗎?謝謝。 – ale

+0

@alemaster - 不,插入函數將使用複製構造函數將Derivation對象插入到向量中。編譯器生成的拷貝構造函數對這個類應該沒問題。 – Mankarse