Một trong những thách thức khi thực hiện const
-độ chính xác là bạn không thể làm điều đó nửa chừng. Đó là hoặc là tất cả hoặc không có gì. Nếu bạn cố gắng làm điều đó nửa chừng, bạn kết thúc ở một nơi khó khăn như bạn đang ở đây. Bạn kết thúc với một lớp học tốt đẹp const
-sai được sử dụng bởi một số điên cũ, thường di sản (hoặc được viết bởi một crummudgeon cũ) mã đó không phải là const
-chính xác và nó chỉ không hoạt động. Bạn đang tự hỏi nếu const
-đúng là giá trị tất cả các rắc rối.
I need to call a non-const method [from a const method]
Bạn không thể - không trực tiếp. Cũng không nên bạn. Tuy nhiên, có một cách khác ...
Rõ ràng bạn không thể gọi phương thức không phải là const
từ phương thức const
. Nếu không, const
sẽ không có ý nghĩa khi được áp dụng cho các chức năng của thành viên.
Chức năng thành viên const
có thể thay đổi biến thành viên được đánh dấu mutable
, nhưng bạn đã chỉ ra rằng điều này là không thể trong trường hợp của bạn.
Bạn có thể thử bỏ đi const
bằng cách thực hiện một cái gì đó như SomeClass* me = const_cast<SomeClass*>(this);
nhưng A) Điều này thường sẽ dẫn đến UB hoặc 2) Nó vi phạm toàn bộ ý tưởng của const
-độ chính xác.
Một điều bạn có thể làm, nếu những gì bạn đang thực sự cố gắng thực hiện sẽ hỗ trợ điều này, là tạo một đối tượng proxy không const
và không làm const
. Để wit:
#include <iostream>
#include <string>
using namespace std;
class Gizmo
{
public:
Gizmo() : n_(42) {};
void Foo() const;
void Bar() { cout << "Bar() : " << n_ << "\n"; }
void SetN(int n) { n_ = n; };
int GetN() const { return n_; }
private:
int n_;
};
void Gizmo::Foo() const
{
// we want to do non-const'y things, so create a proxy...
Gizmo proxy(*this);
int save_n = proxy.GetN();
proxy.SetN(save_n + 1);
proxy.Bar();
proxy.SetN(save_n);
}
int main()
{
Gizmo gizmo;
gizmo.Foo();
}
Nguồn
2011-11-30 18:17:55
Nó sẽ không được chống lại các nguyên tắc chung là một hàm const? – DumbCoder
@DumbCoder, từ bên ngoài, nó là một hàm const trong đó không có gì hiển thị cho khách hàng đã được thay đổi. –
Một phương pháp không const ngụ ý rằng nó đang thay đổi một số dữ liệu trong đối tượng của bạn. Nếu 'someMethod()' gọi một phương thức không phải là const, thì nó đang gián tiếp thay đổi dữ liệu. Vì vậy, thực sự, 'someMethod()' đơn giản không nên là 'const'. –