2015-10-21 33 views
23

Tôi có chức năng chấp nhận tham chiếu const làm đối số. Nó không nên thay đổi đối số, nhưng nó (biến "_isVertex"). Làm thế nào để sửa cái này? Đây là mã:Chức năng thay đổi đối tượng const

#include <vector> 
#include <iostream> 

using namespace std; 

class Element 
{ 
public: 
    bool isVertex() const 
    { return _isVertex; }; 

private: 
    bool _isVertex = true; 
}; 

class ElementContainer : public vector <Element> 
{ 
public: 
    void push(const Element &t) 
    { 
     // here everything is fine 
     cerr << t.isVertex() << ' '; 
     push_back(t); 
     // and here _isVertex is false, should be true! 
     cerr << t.isVertex() << '\n'; 
    } 
}; 

int main() 
{ 
    ElementContainer vertex; 

    vertex.push({}); 
    vertex.push(vertex[0]); 
} 
+0

Cộng một: bạn đã có tôi. Lưu ý rằng các thùng chứa thư viện chuẩn C++ không được thiết kế để là các lớp cơ sở. – Bathsheba

+0

'const' ở cuối khai báo hàm chỉ đảm bảo rằng trạng thái của lớp sẽ không thay đổi do gọi hàm. Giá trị trả về không phải là const, và có thể được thay đổi sau khi thực tế. –

Trả lời

32

Xem xét cẩn thận vertex.push(vertex[0]);. t trong hàm push là tham chiếu liên tục đến vertex[0].

Nhưng sau push_back, nội dung của vectơ đã di chuyển (do tái phân bổ bộ nhớ), và do đó vector[0] đã di chuyển ở nơi khác. t hiện là tài liệu tham khảo số treo lơ lửng.

Đó là hành vi không xác định. Boom.

+0

Đáng chú ý rằng dường như 't' được đẩy vào cửa hàng sao lưu mới được phân bổ _after_ dữ liệu hiện có được sao chép và cửa hàng sao lưu cũ được deallocated. – imallett

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