Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
"member": nie może uzyskać dostępu do składowej "access_level" zadeklarowanej w klasie "class"
Uwagi
Składowe klasy pochodnej nie mogą uzyskiwać dostępu do private składowych klasy bazowej. Nie można uzyskać dostępu do private wystąpień klas ani protected ich składowych.
Przykłady
Poniższy przykład generuje C2248, gdy private lub protected składowe klasy są dostępne spoza klasy. Aby rozwiązać ten problem, nie należy uzyskiwać dostępu do tych elementów członkowskich bezpośrednio poza klasą. Używanie public danych składowych i funkcji składowych do interakcji z klasą.
// C2248_access.cpp
// compile with: cl /EHsc /W4 C2248_access.cpp
#include <stdio.h>
class X {
public:
int m_publicMember;
void setPrivateMember( int i ) {
m_privateMember = i;
printf_s("\n%d", m_privateMember);
}
protected:
int m_protectedMember;
private:
int m_privateMember;
} x;
int main() {
x.m_publicMember = 4;
printf_s("\n%d", x.m_publicMember);
x.m_protectedMember = 2; // C2248 m_protectedMember is protected
x.m_privateMember = 3; // C2248 m_privMemb is private
x.setPrivateMember(0); // OK uses public access function
}
Innym problemem zgodności, który uwidacznia C2248, jest użycie znajomych i specjalizacji szablonu. Aby rozwiązać ten problem, zadeklaruj szablony funkcji znajomych przy użyciu pustej listy <> parametrów szablonu lub określonych parametrów szablonu.
// C2248_template.cpp
// compile with: cl /EHsc /W4 C2248_template.cpp
template<class T>
void f(T t) {
t.i; // C2248
}
struct S {
private:
int i;
public:
S() {}
friend void f(S); // refer to the non-template function void f(S)
// To fix, comment out the previous line and
// uncomment the following line.
// friend void f<S>(S);
};
int main() {
S s;
f<S>(s);
}
Oto kolejny problem zgodności, który uwidacznia C2248: Próbujesz zadeklarować znajomego klasy, ale klasa nie jest widoczna dla deklaracji znajomej w zakresie klasy. Aby rozwiązać ten problem, przyznaj przyjaźń otaczającej klasie.
// C2248_enclose.cpp
// compile with: cl /W4 /c C2248_enclose.cpp
class T {
class S {
class E {};
};
friend class S::E; // C2248
};
class A {
class S {
class E {};
friend class A; // grant friendship to enclosing class
};
friend class S::E; // OK
};