Aracılığıyla paylaş


Derleyici Hatası C2248

'member': 'class' sınıfında bildirilen 'access_level' üyesine erişemiyor

Açıklamalar

Türetilmiş bir sınıfın üyeleri temel sınıfın üyelerine erişemez private . Sınıf örneklerine veya protected üyelerine erişemezsinizprivate.

Örnek

Aşağıdaki örnek, veya protected bir sınıfın üyelerine sınıfın dışından erişildiğinde private C2248 oluşturur. Bu sorunu çözmek için bu üyelere doğrudan sınıfın dışından erişemezsiniz. Sınıfla etkileşime geçmek için üye verilerini ve üye işlevlerini kullanın public .

// 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
}

C2248'i kullanıma sunan bir diğer uyumluluk sorunu da şablon arkadaşlarınızın kullanılması ve uzmanlaşmadır. Bu sorunu çözmek için boş bir şablon parametre listesi <> veya belirli şablon parametreleri kullanarak arkadaş işlevi şablonlarını bildirin.

// 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);
}

C2248'i kullanıma sunan başka bir uyumluluk sorunu daha: Sınıfın bir arkadaşını bildirmeye çalışıyorsunuz, ancak sınıf, sınıfın kapsamında arkadaş bildirimine görünmüyor. Bu sorunu çözmek için kapsayan sınıfa arkadaşlık verin.

// 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
};