5

我没想到这个代码编译:唯一指针和const正确性

#include <iostream> 
#include <memory> 

class A 
{ 
public: 

    inline int get() const 
    { 
     return m_i; 
    } 

    inline void set(const int & i) 
    { 
     m_i = i; 
    } 

private: 

    int m_i; 
}; 

int main() 
{ 
    const auto ptr = std::make_unique<A>(); 

    ptr->set(666); // I do not like this line D:< 
    std::cout << ptr->get() << std::endl; 

    return 0; 
} 

如果PTR是一个原始的C指针,我将是确定这一点。但因为我使用的是智能指针,所以我无法理解这背后的原因。

我使用独特的指针来表示所有权,在面向对象编程中,这可以看作是一个对象组合(“部分”关系)。

例如:

class Car 
{ 
    /** Engine built through some creational OO Pattern, 
     therefore it has to be a pointer-accessed heap allocated object **/ 
    std::unique_ptr<Engine> m_engine; 
}; 

或者:

class A 
{ 
    class Impl; 

    std::unique_ptr<A::Impl> m_impl; // PIMPL idiom 
}; 

如果一个类Car的实例是不断,为什么不引擎应该是恒定的呢?如果这是一个共享指针,我会完全正确的。

有没有可以反映我想要的行为的智能指针?

+1

'ptr-> set(666); //我不喜欢这一行D:<':每日报价;)。 – 3442

回答

11

这很简单:

const auto ptr = std::make_unique<A>(); 

这意味着指针本身是不变的!但它所持有的对象不是。你可以看到它工作的另一种方式...

A *const ptr = new A(); 

这是一样的。指针是常量(不能被修改指向其他地方),但该对象不是。

现在,你可能意味着你想要这样的东西,不是吗?

const auto ptr = std::make_unique<const A>(); 

这将创建一个常数指针,指向常量A

还有这种其他办法...

auto ptr = std::make_unique<const A>(); 

的目标是不变的,但不是指针。

BTW:你所说的“常量传播”也适用于C++,就像你说的那样。

+0

是的,很清楚,对于只有一个问题内部提出太多问题感到抱歉。其中之一确实是这样的:为什么C++委员会为其提供了一个独特的智能指针,就像C原始指针一样?这背后的理由是什么? – nyarlathotep108

+1

@ nyarlathotep108:在开始的时候,它似乎是一个无意义的东西,直到你意识到一个指针只不过是另一个发生在另一个对象地址上的对象。有时候你想把指针改为其他地方的指针,但它可能指向常量对象。在这种情况下(它们很常见),这种模式可以节省您的工作。 – 3442

+0

我现在没有发现它有用,但我看到你的观点可能是有效的。也许当我希望他们的行为与引用行为一样时(从const的正确性角度来看),我会写自己独特的指针,我看不到其他任何方式。 – nyarlathotep108