2012-03-15 42 views
9

Possible Duplicate:
C++ STL set update is tedious: I can't change an element in placestd :: set iterator tự động const

Tôi đã trích xuất vấn đề và đổi tên và vì thế vì mục đích đơn giản.

Về cơ bản tôi nhanh chóng một lớp học và tôi trữ nó trong một std :: set, sau này tôi muốn có một tham chiếu đến lớp vì vậy mà tôi có thể kiểm tra giá trị của nó và thay đổi chúng ...

mã đơn giản:

 MyClass tmpClass; 
     std::set<MyClass > setMyClass; 
     setMyClass.insert(tmpClass); 
     std::set<MyClass >::iterator iter; 
     iter=setMyClass.begin(); 
     MyClass &tmpClass2=*iter; 

và các lỗi:

error C2440: 'initializing' : cannot convert from 'const MyClass' to 'MyClass &' 

(tôi đã gỡ bỏ các bộ phận của thông báo lỗi, "MVB :: Run ::" để xóa nó lên quá.)

nếu tôi thêm một 'const' trước vào dòng cuối cùng của mã thì mọi thứ hoạt động tốt nhưng sau đó tôi không thể thay đổi giá trị ...

Đây có phải là hành vi bình thường và tôi phải loại bỏ dữ liệu, thay đổi giá trị và đưa nó trở lại?

Tôi có cảm giác rằng việc này có liên quan đến việc sắp xếp tập hợp nhưng tôi sẽ không chạm vào các biến được sử dụng để sắp xếp.

Trả lời

12

tôi bạn chắc chắn bạn won't touch the variables that are used for the sorting các bạn có thể làm việc này bằng cách sử dụng một const_cast như thế này:

MyClass tmpClass; 
    std::set<MyClass > setMyClass; 
    setMyClass.insert(tmpClass); 
    std::set<MyClass >::iterator iter; 
    iter=setMyClass.begin(); 
    const MyClass &tmpClass2=*iter; 

    MyClass &tmpClass3 = const_cast<MyClass&>(tmpClass2); 

Ngoài ra, bạn có thể khai báo các thành viên của lớp mà bạn có ý định thay đổi khi mutable.

+2

Bạn có thể làm điều này, nhưng đó là thực hành không tốt. –

12

Có, điều này được mong đợi. Nếu bạn có thể chỉnh sửa các đối tượng đã có trong tập hợp, thứ tự sắp xếp được áp dụng có thể không còn áp dụng nữa, dẫn đến hành vi không xác định.

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