Błąd kompilatora C2248
"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ład
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
};