Đôi khi, khái niệm về sự riêng tư của C++ chỉ baffles tôi :-)ủy thành các phần riêng
class Foo
{
struct Bar;
Bar* p;
public:
Bar* operator->() const
{
return p;
}
};
struct Foo::Bar
{
void baz()
{
std::cout << "inside baz\n";
}
};
int main()
{
Foo::Bar b; // error: 'struct Foo::Bar' is private within this context
Foo f;
f->baz(); // fine
}
Kể từ Foo::Bar
là private
, tôi không thể tuyên bố b
trong main
. Tuy nhiên, tôi có thể gọi các phương thức từ Foo::Bar
tốt. Tại sao cái này lại được phép? Đó có phải là một tai nạn hay do thiết kế?
Oh chờ đợi, nó được tốt hơn:
Foo f;
auto x = f.operator->(); // :-)
x->baz();
Mặc dù tôi không được phép để đặt tên cho loại Foo::Bar
, nó hoạt động tốt với auto
...
Noah đã viết:
loại các tên được định nghĩa trong một định nghĩa lớp không thể được sử dụng bên ngoài lớp của chúng mà không có trình độ chuyên môn.
Chỉ cần cho vui, đây là cách bạn có thể có được ở các loại từ bên ngoài:
#include <type_traits>
const Foo some_foo();
typedef typename std::remove_pointer<decltype(some_foo().operator->())>::type Foo_Bar;
Để viết tắt ví dụ mã của bạn, về cơ bản bạn hỏi liệu pháp lý có thiết kế để trả về kiểu riêng ('Foo :: Bar *') từ hàm thành viên công cộng ('Foo :: operator ->()' hay không)? – stakx
@stakx Hmmm, tôi đoán vậy :) +1 – fredoverflow
Về ví dụ mã 'auto' của bạn, tôi nghĩ đó là viết tắt của' auto int'. Điều này thực sự biên dịch và chạy một cách chính xác? – stakx