là gì C++ cách "đúng" làm const-to-nonconst này? Tĩnh đúc? Lexical cast? Thứ gì khác?
Không có cách nào C++. Vì một lý do nào đó, tác giả của lớp đó đã quyết định rằng bạn không thể sửa đổi cá thể thông qua phương thức này.
Nếu bạn là tác giả, bạn có thể làm cho nó trở về tham chiếu không phải là const. Nhưng những điều đó vẫn còn đáng ngờ, trừ khi lớp học thực sự không ẩn doanh nghiệp của bạn (ví dụ: vector không ẩn những gì nó giữ cho bạn và chỉ ẩn cách nó giữ nội dung cho bạn).
Một cách tốt hơn (tùy thuộc vào điều này là gì) cũng có thể không để lộ thành viên cho thao tác bên ngoài, mà là cung cấp phương pháp thao tác này cho bạn. Ví dụ:
class BadPosition
{
int x, y;
public:
int& get_x() { return x; }
int& get_y() { return x; }
//...
};
BadPosition p;
p.get_x() += 1;
p.get_y() += -1;
class BetterPosition
{
int x, y;
public:
void move(int x_inc, int y_inc) { x += x_inc; y += y_inc; }
//...
};
BetterPosition p;
p.move(1, -1);
Nếu bạn cần điều này để đặt lớp ở trạng thái hợp lệ sau đó, có thể xem xét làm cho hàm tạo của nó làm điều đó. Nếu bạn không thể làm điều đó, ít nhất là cung cấp một phương thức Init(), để không làm cho một lớp phức tạp như vậy hoàn toàn dựa vào việc bị thao tác bên ngoài vào một cái gì đó có thể sử dụng được. Có thể dĩ nhiên bạn có thể tạo một bản sao, sửa đổi và sau đó sử dụng bản sao sửa đổi để thay thế toàn bộ bản sao bằng một bản khác (giả sử điều này là đủ để xây dựng nó):
X x;
...
Y y = x.get();
y.modify();
x = X(y);
Edit: Vì vậy, lợi nhuận lớp bằng giá trị? Trong trường hợp này không nên có cách nào để sửa đổi cá thể trong lớp, vì tất cả những gì bạn nhận được là một bản sao ngay từ đầu. Bạn có thể tham chiếu với tham chiếu const, nhưng ngay cả khi bạn bỏ đi constness từ tham chiếu đó, bạn vẫn đang tham chiếu tạm thời.
Câu trả lời của tôi ở trên giả định nó trả về tham chiếu const, vì điều đó có vẻ hợp lý hơn (tôi chưa thấy mọi người thường trả về giá trị const, mặc dù có thể có những người khuyên bạn nên sử dụng nó).
Chức năng ban đầu có trả lại 'const myType' hoặc' const myType & 'không? –
'const myType' Tôi nghĩ rằng –
@Lou Franco: Xin lỗi, nhưng điều đó không đúng. Mã trong bài đăng gốc là một ví dụ về sách giáo khoa về tình huống, điều này làm cho toàn bộ thời gian tạm thời được mở rộng để phù hợp với thời gian tồn tại của tham chiếu. Không, tạm thời không bị phá hủy ở đây. – AnT