2013-04-24 33 views
3

我想根據指針的值爲const QList賦值。C++爲const QList賦值if ... else

invar是一個指針,如果是NULL我想第一個值賦給const QList mylist,如果不是NULL,另一個值。但是觀察到const的正確性:之後我不打算改變mylist的值。

是否有可能有

if(invar) 
    const QList<Type> zoneList = invar->getZones(); 
else 
    const QList<Type> zoneList = aList ; 
我定義 zoneList僅一次

,那麼,爲什麼這無法正常工作?

此外,我在我的方法的下一部分中使用zoneList,我得到這個編譯錯誤:undeclared identifier

但我不能寫,要麼

const QList<Type> zoneList ; 

    if(invar) 
     zoneList = invar->getZones(); 
    else 
     zoneList = NULL ; 

,我有編譯器錯誤錯誤1

error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const QList<T>' (or there is no acceptable conversion) 

是否有可能有一個分配給取決於這個常數的QList兩個不同的值條件?那麼寫什麼是正確的方法?

回答

8

使用三元運算?:

const QList<Type> zoneList(invar ? invar->getZones() : aList); 

BTW是NULL還是aList?你的代碼都在上面。

if(invar) 
    const QList<Type> zoneList = invar->getZones(); 
else 
    const QList<Type> zoneList = aList ; 

,因爲每個zoneList變量僅if語句內部定義不起作用。

4

有了這樣一個簡單的條件,你可以只使用三元運算符:

const QList<Type> zoneList = invar ? invar->getZones() : aList; 

如果初始化得到比這更復雜,你碰巧使用C++ 11,那麼你可以使用一個新的成語通過lambda表達式成爲可能:

const QList<Type> zoneList = []() -> QList<Type> { 
          // ^^ possibly [&] to capture variables 

     // some complex stuff that returns a QList<Type> 

    }(); // Note the() that calls the lambda immediately 

如果你被卡住C++ 03(或者,Stroustrup的禁止,C++ 98),還留有除了調用另一個函數/方法的幾個解決方案,具有的缺點是你必須傳遞任何你需要計算const值的局部變量作爲參數。


編輯:我知道我還沒有完全回答你的問題。其他人已經解釋說,你的第一個if不能工作,因爲這是一個範圍問題,我不會添加太多,除了添加大括號可能會使它更清晰(注意這與您的代碼是完全相同的:大括號是可選的,當if/else機構都只是一個單一的聲明,但他們的存在/不存在不改變代碼的語義):

if (invar) { 
    const QList<Type> zoneList = invar->getZones(); 
} 
else { 
    const QList<Type> zoneList = aList; 
} 
+0

拉姆達的好用例。 – leemes 2013-04-24 07:25:45

+1

@leemes:是的,我不久前發現它(我相信H.Sutter的博客),它讓我覺得這是一個很好的解決這個老問題的方法。從那時起,每當話題出現時,我都會盡力傳播。 ;) – syam 2013-04-24 07:28:32

+0

實際上,在我們當前的工程中,我們使用了大量的const智能指針,但是當創建一個新的對象並設置屬性時,它不應該是const的,但我們必須返回一個const指針或繼續下一步用const指針。我們目前的「最好的我們可以得到」的解決方案是首先保持指針非常量和非智能,並且只在返回語句中「包裝」它,只要它應該是const。在這種情況下,我將您的解決方案集成在一起,這將會有很大的改進謝謝! – leemes 2013-04-24 07:32:14

1

如果你

if(invar) 
    const QList<Type> zoneList = invar->getZones(); 
else 
    const QList<Type> zoneList = aList ; 

zoneList範圍限於ifelse b牧場,在外面它不再存在。
如果你這樣做

const QList<Type> zoneList ; 

if(invar) 
    zoneList = invar->getZones(); 
else 
    zoneList = NULL ; 

zoneList聲明const,不能在if/else改變。

對於黑客你可以使用const_cast,但這是不好的做法,所以你必須初始化zoneList

zoneList = invar != 0 ? invar->getZones() : 0; //don't use NULL in C++