2013-06-04 24 views
0

當我取消引用一個指針並將其指定給它時,它會更改指針指向的內容,它不會調用operator=指向的內容。我做了這個程序來證明這一點:如何使指針的引用保持對該對象的引用?

#include <iostream> 

struct S 
{ 
    void operator =(int) 
    { x = 5; } 

    operator int*() 
    { 
     return &x; 
    } 

    int x; 
}; 

std::ostream& operator <<(std::ostream& out, S const& s) 
{ 
    return out << s.x; 
} 

int main() 
{ 
    S s; 
    int *x = s; 
    *x = 10; 

    std::cout << *x; 
} 

這將打印10.做*x = 10不修改對象x點。我怎樣才能做到這一點? (歡迎使用C++ 11解決方案)

+0

你的第一句話是不正確的。 –

+0

你怎麼可能知道賦值給'int'的賦值操作符何時被調用? – chris

+0

即使把不確定的行爲放在一邊,你的結論是沒有意義的。如果你說'* x = 10;'。然後打印'* x'並查看'10'。你如何得出結論,「x」指向的對象沒有被修改,因爲如果*被修改,結果正是你期望的結果? –

回答

1

使用std::reference_wrapper

#include <memory> 
#include <functional> 

int main() 
{ 
    S s; 
    auto x = std::make_shared<S>(std::ref(s)); 
    *x = 10; 

    std::cout << *x; // prints 5 
} 

Here is a demo.

2

您的代碼是未定義的行爲。 int *x = S();x初始化爲一個臨時地址,在完整表達式的末尾被破壞,因此*x是非法的。

0

也許你打算定義類型S的x?當它是int類型時,沒有理由調用重載操作符。

1

在主函數中的局部變量xpointer to int類型。它指向的intS實例的S::x子對象,如由S::operator int*返回的那樣。當你解除引用時,你會得到一個類型爲int的左值,它仍然是S::x子對象。因此,當您在此左值int上調用operator=時,它將調度到內置int::operator=,而不是您的用戶定義的S::operator=

用戶定義的S::operator=函數不是由類的成員子對象「繼承」的。我認爲這是令你困惑的事情。

如果你想使用S::operator=,那麼你需要用S類型的左值來調用它:

int main() 
{ 
    S s; 
    S *x = &s; 
    *x = 10; 

    std::cout << x->x; 
} 

會做你想要什麼,並呼籲S::operator=

相關問題