2011-09-05 12 views
16

Bir dll ve bazı uygulama kodları arasında paylaşılan bir temel sınıf oluşturmam gereken bir programım var. Sonra ana uygulamada dll biri olmak üzere iki farklı türetilmiş sınıfım var. Bunların her biri, nase sınıfındaki veriler üzerinde çalışan bazı statik üye işlevlerine sahiptir. (Başka yerlerde fonksiyon gösterici olarak kullanıldığı gibi statik olmaları gerekir). En basit haliyle, benim sorunum aşağıda gösterilmiştir.Korumalı üyelere temel sınıftan türetilmiş bir sınıftaki statik işlevden erişebilir miyim?

class Base { 
protected: 
    int var ; 
}; 

class Derived : public Base { 
    static bool Process(Base *pBase) { 
    pBase->var = 2; 
    return true; 
    } 
}; 

Benim derleyici ben Base erişimi koruduğuna Türetilmiş rağmen Ptaban ait korumalı üyelerine erişemez şikayet ediyor. Bunun bir yolu var mı, yoksa bir şeyi yanlış anlamış mıyım? Temel değişkenleri herkese açık hale getirebilirim, ancak bu benim gerçek örneğimde olduğu gibi kötü olacaktır, bunlar bir ayrılmış bellek yığınıdır ve çoklu okuma için bunu korumak için kullanılan semaforlardır.

Yardım?

+1

olası yinelenen (http://stackoverflow.com/questions/4829518/accessing-parents-protected-variables). Bu, özellikle fonksiyonun "statik" olup olmadığı değil, temel üyeye erişildiği parametrenin "Türetilmiş" türünde olmamasıdır. –

+0

Statik fonksiyonun argümanı, fonksiyon göstericisinin çağrı gereksinimlerine uygun temel sınıfta olmalıdır. Belki bir dinamik döküm –

+1

kullanarak alabilirsiniz. Eğer işlev sadece 'Base' nesnelerini' Base' nesnesine 'türevli' nesnelere dönüştüren 'static 'nesnesine dönüştürmek için kullanabilirsiniz. Fonksiyon gövdesinde 'Base *' 'Türetilmiş *'. Aksi halde “Base” bir “arkadaş” olmanız ya da “var” kelimesini halka açıklayabilmeniz gerekir. Bunlardan hiçbirini yapamazsan, sıkışmışsın demektir. –

cevap

10

Genel olarak (işlevin statik olup olmadığına bakılmaksızın), türetilen sınıfın bir üye işlevi, yalnızca türünün nesnelerinin korunan tabanına sınıf üyelerine erişebilir. Statik tip türetilmiş sınıftan (veya bundan türetilen bir sınıf) değilse, korumalı tabanına üye erişemez. Böylece:

class Base { 
protected: 
    int var; 
} ; 

class Derived : public Base { 
    static void f1(Derived* pDerived) 
    { 
     pDerived->var = 2; // legal, access through Derived... 
    } 
    static bool Process(Base *pBase) 
    { 
     pBase->var = 2 ; // illegal, access not through Derived... 
    } 
} ; 
+0

Bu yüzden, statik fonksiyonumun bir fonksiyon gösterici için kullanıldığı ve argümanın türetilmiş sınıfa dinamik olarak yayınlanabilmesi gereken temel sınıf olması gerektiği sanırım. –

+1

Temel sınıfın en az bir sanal işlevi varsa, evet. (Ya da "Türetilmiş *" işlevini değiştirmek için işlevi değiştirebilir ve "dynamic_cast" öğesini istemciye bırakabilirsiniz.) –

0

Erişim belirteci Derived sınıf kolu (referans/işareti/nesne) olup Derived sınıfın kendi yöntemleri için de geçerlidir. Yöntem static olmasa bile, aynı hatayla sonuçlanırdınız. Çünkü türetilmiş tanıtıcıya var erişmiyorsunuz. Demo.

class Base { 
protected: 
    int var ; 
public: 
    void setVar(const int v) { var = v; } // <--- add this method 
}; 

Not:

doğru yolu setter yöntem sağlamaktır dışarı bir daha yolu yoktur, ama zarif emin değilim. [Ebeveynin korumalı değişkenleri erişme] arasında

(static_cast<Derived*>(pBase))->var = 2; 
+0

Gerçek sınıfımda, temel sınıftaki veriler aslında bir miktar bellek bloğu ve bir çok semafor yüküdür. çok dişli erişim için. Tabanda belki de 10-15 değişken olduğu gibi semaforlar ve bellek kütlesi için alıcılar ve ayarlayıcılar kullanmak çok hantal görünüyor. –

İlgili konular