2013-05-09 16 views
6

İşte benim kod:türetilmiş sınıftan temel sınıfta korumalı üye erişilemiyor

#include <iostream> 
#include <cmath> 
#include <sstream> 
using namespace std; 

class root 
{ 
    protected : 

      int size; 
      double *array; 

    public : 

     virtual ~root() {} 
     virtual root* add(const root&) = 0; 
     virtual root* sub(const root&) = 0; 
     virtual istream& in(istream&, root&) = 0; 
     virtual int getSize() const = 0; 
     virtual void setSize(int); 
}; 

class aa: public root 
{ 

    public : 

     aa(); 
     aa(int); 
     aa(const aa&); 
     root* add(const root& a); 
     root* sub(const root& a); 
     istream& in(istream&, root&){} 
     int getSize() const; 
     void setSize(int); 
}; 

class bb: public root 
{ 
public: 
    bb() { } 
    bb(const bb& b) { } 
    root* add(const root& a); 
    root* sub(const root& a); 
    istream& in(istream&, root&){} 
    int getSize() const{} 
    void setSize(int){} 
}; 

aa::aa() 
{ 
    size = 0; 
    array = NULL; 
} 

aa::aa(int nsize) 
{ 
    size = nsize; 
    array = new double[size+1]; 
    for(int i=0; i<size; i++) 
     array[i] = 0; 
} 

root* aa::add(const root& a) 
{ 
    for (int i=0; i<a.size; i++) 
     array[i] += a.array[i]; 
    return *this; 
} 

root* aa::sub(const root& a) 
{ 
} 

int aa::getSize() const 
{ 
    return size; 
} 

void aa::setSize(int nsize) 
{ 
    size = nsize; 
    array = new double[size+1]; 
    for(int i=0; i<size; i++) 
     array[i] = 0; 
} 

root* bb::add(const root& a) 
{ 
    return new bb(); 
} 

root* bb::sub(const root& a) 
{ 

} 

int main(int argc, char **argv) 
{ 
} 

Ben size erişmek istediğiniz veya türetilmiş sınıftaki bir array, ben sadece benim derleyici can diyor çünkü:

/home/brian/Desktop/Temp/Untitled2.cpp||In member function ‘virtual root* aa::add(const root&)’:| 
/home/brian/Desktop/Temp/Untitled2.cpp|10|error: ‘int root::size’ is protected| 
/home/brian/Desktop/Temp/Untitled2.cpp|66|error: within this context| 
/home/brian/Desktop/Temp/Untitled2.cpp|11|error: ‘double* root::array’ is protected| 
/home/brian/Desktop/Temp/Untitled2.cpp|67|error: within this context| 
/home/brian/Desktop/Temp/Untitled2.cpp|68|error: cannot convert ‘aa’ to ‘root*’ in return| 
||=== Build finished: 5 errors, 0 warnings ===| 
Ben korumalı üyeler türetilmiş sınıflarda gizli olduğu için, Tamam gibi görünüyor okudum ama değil mi. Bunu nasıl düzeltebilirim?

cevap

6

Korunan üyelerin türetilmiş sınıflarda özel olduğunu okudum, bu yüzden iyi görünüyor, ama değil.

bir protected veri elemanı, bir taban sınıfı A miras, çünkü (bu durumda, aa) türetilmiş bir sınıf B ile (root Bu durumda,) değil sürece erişilen gibi erişilebilir tip B bir amacı (aa). Burada, tip A bir nesne (root) aracılığıyla erişen: Daha önce açıklanan ötesinde

ek erişim kontrolü: Paragraf C++ 11 Standardının 11.4/1 Başına

root* aa::add(const root& a) 
{ 
    for (int i=0; i<a.size; i++) 
    //    ^^^^^^ 
    //    Accessing size on an object of type `root`, not `aa`! 
     array[i] += a.array[i]; 
    return *this; 
} 

Madde 11'de, statik olmayan bir veri üye veya statik olmayan üye işlevi, adlandırma sınıfının (11.2) korumalı bir üyesi olduğunda uygulanır. olarak referans bazı sınıf C bir arkadaş veya üye oluşur çünkü önce, korumalı bir üyesine erişim verilir tanımladı. erişim elemanı (5.3.1) için bir işaretçi oluşturmak için, iç içe-ad-belirteci, diğer bütün erişimler (muhtemelen dolaylı) bir amacı ekspresyonunu içerir (5.2.5) C veya C türetilmiş bir sınıf belirtecektir . [Örnek :

class B { 
protected: 
    int i; 
    static int j; 
}; 
class D1 : public B { 
}; 
class D2 : public B { 
    // ... 
    void mem(B*,D1*); 
}; 

void D2::mem(B* pb, D1* p1) { 
    pb->i = 1; // ill-formed 
    p1->i = 2; // ill-formed 
    // ... 
    i = 3; // OK (access through this) 
    B::i = 4; // OK (access through this, qualification ignored) 
    j = 5; // OK (because j refers to static member) 
    B::j = 6; // OK (because B::j refers to static member) 
} 

- uç örneği] Bu durumda, nesne ifade C sınıfı veya C türetilmiş bir sınıf olacaktır

Bunu düzeltmek için, kamu ayarlayıcıları/alıcıları sağlamanız gerekir.

for (int i=0; i<a.size; i++) 
//    ^^^^^^ 

Bu yazabiliriz: Benzer

for (int i=0; i<a.getSize(); i++) 
//    ^^^^^^^^^^^ 

, sen n- değeri/alma ayarlama işlevleri sağlamak zorunda kalacak Zaten, bu yüzden onun yerine bu yazı bir getSize() fonksiyonu var array inci elemanı, yazdığınız diye:

array[i] += a.get_at(i); 

Bildirimi, += sol tarafındaki ifade Tamam olduğunu,çünkü'a this aracılığıyla erişilebilir (ayrıca bkz. Yukarıdaki örnek C++ 11 Standardından).

+0

Teşekkürler :) Bunu düzeltmek için herhangi bir yol var mı? –

+2

@BrianBrown: 'root' üzerinde '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'adlı çağrılabilir bir' '' '' '' '' 'adlı çağrılabilir olabilir, bu kabul edilebilir? –

+0

Zaten onu 'root' olarak tanımladım ama saf sanal (yanlış, doğru mu?). Ama nasıl bir dizi hakkında? –

İlgili konular