2013-06-04 22 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=

相关问题