5

tôi đã không hy vọng mã này để biên dịch:con trỏ độc đáo và đúng đắn 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; 
} 

Nếu ptr là một con trỏ C thô, tôi sẽ ok với điều đó. Nhưng vì tôi đang sử dụng con trỏ thông minh thông minh, tôi không thể hiểu lý do đằng sau điều này là gì.

Tôi sử dụng con trỏ duy nhất để thể hiện quyền sở hữu, trong Lập trình hướng đối tượng, điều này có thể được xem là thành phần đối tượng (mối quan hệ "một phần").

Ví dụ:

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; 
}; 

Hoặc:

class A 
{ 
    class Impl; 

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

Nếu một thể hiện của một lớp Car là liên tục, tại sao Engine không nên thường xuyên không? Nếu đó là một con trỏ chia sẻ, tôi sẽ hoàn toàn ổn với điều đó.

Có một con trỏ thông minh nào có thể phản ánh hành vi tôi muốn không?

+1

'ptr-> set (666); // Tôi không thích dòng này D: <': Trích dẫn trong ngày;). – 3442

Trả lời

11

Nó khá đơn giản:

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

Điều này có nghĩa rằng con trỏ tự là hằng số! Nhưng đối tượng mà nó nắm giữ thì không. Bạn có thể thấy nó hoạt động theo cách khác xung quanh ...

A *const ptr = new A(); 

Cũng vậy. Con trỏ là hằng số (không thể sửa đổi để trỏ đến nơi khác), nhưng đối tượng thì không.

Bây giờ, bạn có thể có nghĩa là bạn muốn một cái gì đó như thế này, phải không?

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

Điều này sẽ tạo con trỏ liên tục đến hằng số A.

Ngoài ra còn có cách nào khác này ...

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

Đối tượng là hằng số, nhưng không phải là con trỏ.

BTW: Điều đó "tuyên truyền" bạn nói về cũng áp dụng cho C++, theo cùng cách bạn đã nói.

+0

Có điều rõ ràng, xin lỗi vì đã đặt quá nhiều câu hỏi trong một câu hỏi. Một trong số đó thực sự là: tại sao một con trỏ thông minh duy nhất đã được tạo ra bởi ủy ban C++ theo cách nó hoạt động giống như một con trỏ C? Lý do đằng sau điều này là gì? – nyarlathotep108

+1

@ nyarlathotep108: Lúc đầu, nó có vẻ là không có ý nghĩa, cho đến khi bạn nhận ra rằng một con trỏ chỉ là một đối tượng khác xảy ra để giữ địa chỉ của một đối tượng khác. Có những lúc bạn muốn thay đổi con trỏ đến điểm khác, nhưng nó có thể trỏ đến các đối tượng không đổi. Trong trường hợp này (chúng khá phổ biến), mẫu này sẽ tiết kiệm công việc của bạn. – 3442

+0

Tôi không thấy nó hữu ích ngay bây giờ, nhưng tôi thấy quan điểm của bạn có lẽ là một điểm hợp lệ.Có lẽ khi tôi muốn họ hành động theo cách tương tự như hành động tham khảo (từ một điểm chính xác const của xem), tôi sẽ viết con trỏ độc đáo của riêng tôi, tôi không thể nhìn thấy bất kỳ cách nào khác. – nyarlathotep108