2012-01-14 196 views
5

我有一個叫Location類,我需要一個CARRAY添加到其成員變量。此更改導致需要重載賦值運算符。C++重載賦值運算符

有沒有辦法複製所有之前我做了變化,正在複製這一類類型的變量,只需添加額外的代碼複製CARRAY不單獨複製每一個成員變量?

Location& Location::operator=(const Location &rhs) 
{ 
    // Only do assignment if RHS is a different object from this. 
    if (this != &rhs) 
    { 
     //Copy CArray 
     m_LocationsToSkip.Copy(rhs.m_LocationsToSkip); 

     //Copy rest of member variables 
     //I'd prefer not to do the following 
     var1 = rhs.var1; 
     var2 = rhs.var2; 
     //etc 
    } 

    return *this; 
} 
+0

所以,你想,實際上,調用編譯器生成的賦值運算符? 'CArray'是否有一個賦值操作符? – 2012-01-14 23:46:18

+0

它有一個拷貝構造函數,但沒有賦值操作符。我不確定我是否可以調用編譯器生成的賦值運算符,因爲我已經添加了一個CArray成員變量。 – 2012-01-14 23:49:38

+2

不,你不能調用產生的編譯器之一,因爲它不會產生任何更多的時候你提供一個(不是因爲你增加了一個CARRAY成員,唯一改變的事情是,編譯器生成一個對你的類不能調用一個用於CArray,因爲它不存在)。恐怕沒有辦法做到這一點。 – 2012-01-14 23:51:08

回答

4

是,排序的。使用一種自身重載operator=的類型,因此您不必在包含類中進行此操作。即使在編寫MFC代碼時,我仍然主要使用std::vectorstd::string等,而不是MFC集合和字符串類。有時候你用CString卡住了,但我不記得上次用CArray而不是std::vector

+0

我認爲這是最接近我需要的。不幸的是,應用程序的其餘部分使用mfc容器,我討厭將其改爲使用stl容器。不過,這是一個很好的解決方案。謝謝。 – 2012-01-15 00:18:11

0

不,你不能。 最好的方法是使用腳本來生成真實的代碼。

0

這通常是什麼所謂的「複製和交換成語」來完成。你實現了一個複製構造函數和一個交換成員值的方法,最重要的是指向外部數據的指針。隨着你的賦值運算符是這樣的:

C& C::operator=(const C& c) { 
    C tmp(c); 
    this->swap(tmp); 
    return *this; 
} 

你甚至都不需要這樣的自我分配後衛。

+0

但現在你必須枚舉你的'swap'實現中的所有成員。這只是解決問題,並不能解決問題。 – 2012-01-15 03:16:06

+0

嗯,我在這裏沒有看到問題。太多價值會員?將它們打包在一個結構中,如果你打算少打字,就做一個分配。 – 2012-01-15 06:14:24

2

是。我通常做的是將所有東西都放在類中的成員結構中,除了不可複製的東西。就像這樣:

class Location 
{ 
    struct Members 
    { 
     int var1, var2; 
    }; 

    Members m; 
    CArray m_LocationsToSkip; 

public: 
    Location& operator=(Location const& rhs); 
}; 

Location& Location::operator=(const Location &rhs) 
{ 
    // Only do assignment if RHS is a different object from this. 
    if (this != &rhs) 
    { 
     //Copy CArray 
     m_LocationsToSkip.Copy(rhs.m_LocationsToSkip); 

     //Copy rest of member variables 
     m = rhs.m; //will use Members automatically generated operator= 
        //which should do the correct thing because you only put 
        //normally copyable members in m 
    } 

    return *this; 
} 

我第一次發佈有關這位這裏:https://stackoverflow.com/questions/469696/what-is-your-most-useful-c-c-utility/1609496#1609496

+0

這似乎是一個體面的解決方案,但是需要對應用程序的其餘部分進行相當多的重構來支持這一點。 – 2012-01-15 15:20:22

+0

@Cole W:怎麼這樣?你的成員是公開的,並且在應用程序中隨處可見?在這種情況下,另一種選擇是創建一個資源管理類來包含CArray(有些時候比例子比較),所以您可能只有一個可能需要重構的成員(可能不取決於它如何使用)。我在結構中使用了這個例子,因爲這就是我的代碼所需要的(它是指針,而不是數組,而智能指針不是我需要的),但在你的情況下,爲CArray創建一個資源管理類可能會是一個更好的選擇。 – n1ckp 2012-01-15 16:38:45