2012-07-26 54 views
1

說明:無法更改易失性變量的值

我無法設置變量或在定義volatile(在Main中)對其進行更改。刪除易失性解決了這個問題,但我需要我的變量是易變的。

我的嘗試:

真的很多嘗試那裏。重載運算符=,使新運算符=易失性,製造新的易失性方法。到目前爲止沒有任何實際工作

我的主:

int main() { 
    volatile PlaceParentConversion s(10.0); // remove volatile = no errors 
    std::cout << s.mX << std::endl; 
    s = PlaceParentConversion::IDENTITY_CONVERSION; 
    std::cout << s.mX << std::endl; 
    return 0; 
} 

我的類:

class PlaceParentConversion { 
public: //all public, easier to check 
    const static PlaceParentConversion IDENTITY_CONVERSION; 
    double mX; 
    PlaceParentConversion(const double x); 
    PlaceParentConversion(const PlaceParentConversion& other); 
}; 

const PlaceParentConversion PlaceParentConversion::IDENTITY_CONVERSION(0); 

PlaceParentConversion::PlaceParentConversion(const double x) : mX(x) {} 
PlaceParentConversion::PlaceParentConversion(const PlaceParentConversion& other) : mX(other.mX) {} 

錯誤:

‘volatile PlaceParentConversion’ as ‘this’ argument of ‘PlaceParentConversion& PlaceParentConversion::operator=(const PlaceParentConversion&)’ discards qualifiers [-fpermissive] 
+0

有點奇怪使用'volatile'(更不用說在所有)...什麼? – GManNickG 2012-07-26 16:53:29

+0

它被寫成Java中的AtomicReference變量,現在我需要將它重寫到C++。原因是禁用'緩存'這個變量,因爲它可能已經被服務器改變了。我不知道如何,明天會問,並回復。 – Benjamin 2012-07-26 20:00:53

回答

2

定義volatile賦值運算符:

Foo volatile & operator=(Foo const & rhs) volatile 
{ 
    // ... 
    return *this; 
} 

(我爲可讀性縮短你的類名。)


下面是一個更完整的例子:

struct Foo 
{ 
    Foo() { } 
    Foo(Foo const volatile &) { } 
    Foo volatile & operator=(Foo const &) volatile 
    { return *this; } 
}; 

int main() 
{ 
    volatile Foo x; 
    Foo y; 
    static_cast<Foo>(x = y); 
} 

線下決賽的靜態投使得GCC不會發出警告,沒有訪問正在發生在評估賦值表達式的volatile對象上:標準說在無效的上下文中沒有左值到右值的轉換,因此沒有訪問權限。我們使轉換明確。

+0

does static_cast只禁用gcc警告?還是應該使用它,因爲它保留了一些麻煩的應用程序? – Benjamin 2012-07-26 20:03:19

+0

@Benjamin:據我所知,區別在於揮發性變量是否「被訪問」,並且只有當左值到右值轉換髮生時纔會發生。不過,我認爲它沒有任何實際意義。 – 2012-07-26 21:15:07

1

是啊,這是正確的,因爲你有一類型沒有volatile PlaceParentConversion& operator =(const PlaceParentConversion&) volatile;