2012-12-14 31 views
5

Gần đây tôi đã bắt đầu cố gắng thực thi const đúng đắn trong mã của mình. Trong định nghĩa hàm, tôi nuôi một con trỏ hằng cho một đối tượng liên tục của lớp LorentzM:const đúng đắn và shared_ptr, một vấn đề thiết kế?

void AnalysisObject::SetOwnedPointer(const int maptotree_In, const LorentzM* const momentum_In){ 
owned_pp4_original.reset(momentum_In); 
maptotree=maptotree_In; 
} 

nơi owned_pp4_original

shared_ptr<LorentzM> owned_pp4_original; 

Tôi làm điều này, bởi vì chức năng này, SetOwnedPointer, không bao giờ nên thay đổi LorentzM* momentum_In cũng không nên thay đổi đối tượng mà nó trỏ đến, do đó, liên tục trỏ đến đối tượng liên tục.

Tuy nhiên, một shared_ptr được tạo ra để các đối tượng nơi momentum_In điểm đến, và tôi làm muốn sử dụng shared_ptr này để thay đổi các đối tượng sau:

void ChangeLorentzM(const double px, const double py, const double pz, const double E){ 
owned_pp4_original->SetPxPyPzE(px,py,pz,E); //THIS CHANGES THE OBJECT 
} 

Vì vậy, một mặt, để được có thể làm:

owned_pp4_original.reset(momentum_In); 

owned_pp4_original phải là một shared_ptr<const LorentzM>

nhưng sau đó, tôi wouldn không thể thay đổi đối tượng thông qua nó.

Có gì sai trong ảnh này?

cảm ơn rất nhiều.

Trả lời

5

Tôi làm điều này, bởi vì chức năng này, SetOwnedPointer, không bao giờ nên thay đổi các LorentzM * momentum_In cũng không nên thay đổi đối tượng mà nó điểm đến, con trỏ để liên tục để đối tượng liên tục nó được.

Đó không phải là lý do đủ. Hàm có thể không thay đổi trực tiếp đối tượng, nhưng nó đang cấp quyền đối tượng khác (các shared_ptr) để sửa đổi đối tượng. Nó không thể cấp quyền mà bản thân nó không có. Vì vậy, thay đổi nó thành một con trỏ đến một đối tượng không const.

Điều tương tự, ví dụ: nếu bạn có một lớp có thành viên tham chiếu không phải là const. Bạn cần truyền một đối tượng non-const cho hàm tạo của nó, ngay cả khi hàm tạo không tự sửa đổi đối tượng. Người xây dựng cần cấp quyền thành viên tham chiếu của đối tượng để sửa đổi đối tượng và không thể thực hiện điều đó nếu nó không có các quyền đó.

+0

Cảm ơn bạn đã trả lời. Sau đó tôi hiểu lầm rằng một phần của const đúng đắn. Những gì bạn nói có ý nghĩa hơn. – elelias

Các vấn đề liên quan