Czasami pojęcie C++ 's prywatności tylko deflektory mnie :-)delegowania na części prywatnych
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
}
Od Foo::Bar
jest private
, nie mogę zadeklarować b
w main
. Mogę jednak nazwać metody od Foo::Bar
dobrze. Dlaczego, do diabła, jest to dozwolone? Czy to był wypadek czy projekt?
Oh wait, to staje się lepsze:
Foo f;
auto x = f.operator->(); // :-)
x->baz();
Mimo, że nie wolno mi nazwać rodzaj Foo::Bar
, współpracuje tylko z auto
...
Noe napisał:
typ nazwy zdefiniowane w definicji klasy nie mogą być używane poza ich klasą bez kwalifikacji.
Tylko dla zabawy, oto jak można dostać w rodzaju z zewnątrz:
#include <type_traits>
const Foo some_foo();
typedef typename std::remove_pointer<decltype(some_foo().operator->())>::type Foo_Bar;
Aby skrócić przykład kodu, zasadniczo pytasz, czy z założenia zwraca się prywatny typ ('Foo :: Bar *') z funkcji publicznej ('Foo :: operator ->()')? – stakx
@stakx Hmmm, tak sądzę :) +1 – fredoverflow
Odnosząc się do przykładu 'auto', pomyślałem, że był to skrót od' auto int'. Czy to faktycznie się kompiluje i działa poprawnie? – stakx