2011-12-13 57 views
1

C++ STL containor存儲了重載操作者的一類=

#include <iostream> 
#include <vector> 
#include <string> 

class A 
{ 
public: 
    std::string name; 
    int value; 
    A& operator = (const A& from) { value=from.value; return *this; } 
    A(std::string a_name, int a_val) { name=a_name; value=a_val; } 
}; 

int main() 
{  
    std::vector<A> va; 
    va.push_back(A("first",1)); 
    va.push_back(A("second",2)); 

    std::vector<A> vb; 
    vb.push_back(A("third",3)); 
    vb.push_back(A("fourth",4)); 

    va = vb; //point T 

    return 0; 

} 

點T的std ::矢量<甲> ::運算=呼叫每個所存儲的成員的重載操作A ::運營商=

結果是不是我想要的。

我的預期的結果是:
點T,所述VA的部件是完全相同的VB
VA [0] .NAME是 「第三」 和VA [1]。值是「第四」。

但結果只複製值(因爲A ::運算符= copys只有A ::值
在我的項目
A ::運算符=不能因爲它已經使用了許多其他代碼而被更改。
但我也想用std :: container :: operator =。不使用指定的複製功能。

哪種方式可以做到這一點?

+0

類`A`有一個寫得不好的構造函數(沒有初始化列表),所以我不會」不要說維護這個課堂聽起來像是一件值得做的事情。如果這是任何跡象,那麼您正在使用的代碼庫可能整個質量都很差,並可能從重寫中受益。 – 2011-12-13 20:15:50

+0

如果您的作業操作員進行了部分複製,那麼您的原始設計有缺陷是一個很好的建議。 – Chad 2011-12-13 20:16:00

回答

4

這是責任落實賦值運算符以這樣的方式,一個任務a = b;對象a具有相同的語義對象b後。

如果你真的不能做到這一點,那麼也許你可以依靠隱式定義的拷貝構造函數:

std::vector<A>(vb).swap(va); 
// ^^^^^^^^^^^^^ 
// copy of vb