Konstruktor tidak dapat mengakses anggota privat dari kelasnya sendiri

Saya mendapatkan kesalahan berikut di Visual Studio 2008: kesalahan C2248: 'Kota::Kota' : tidak dapat mengakses anggota pribadi yang dinyatakan di kelas 'Kota'. Sepertinya konstruktor tidak dapat mengakses anggota kelasnya sendiri. Tahu apa yang terjadi? Berikut kodenya:

Aku punya ini:

template<class T> class Tree{...}

Dan kelas ini:

class Town{
    Town(int number):number(number){};
    ...
private: 
    int number;
};

Yang digunakan di kelas ini:

class Country{
public:
    StatusType AddTown(Shore side, int location, int maxNeighborhoods);
private:
    Tree<Town> towns[2];
    ...
}

Dan inilah fungsi AddTown:

StatusType Country::AddTown(Shore side, int location, int maxNeighborhoods){
    if (maxNeighborhoods<0 || location<0){
        return INVALID_INPUT;
    }
    Town* dummy= new Town(location);//Here be error C2248
    if (towns[side].find(*dummy)!=NULL){
        delete dummy;
        return FAILURE;
    }
    SouthBorder* dummyBorder;
    (side==NORTH)?dummyBorder=new SouthBorder(location,0):dummyBorder=new SouthBorder(0,location);
    if (southBorders.find(*dummyBorder)!=NULL){
        delete dummyBorder;
        return FAILURE;
    }
    towns[side].add(*dummy);
    delete dummyBorder;
    return SUCCESS;
}

person Epsilon Vector    schedule 07.06.2009    source sumber


Jawaban (3)


Secara default, tingkat akses kelas adalah privat. Jika Anda tidak menambahkan publik: sebelum konstruktor Kota, itu akan menjadi pribadi.

class Town{
public: // <- add this
    Town(int number):number(number){};
    ...
private: 
    int number;
};
person David Rodríguez - dribeas    schedule 07.06.2009

Kode ini memiliki kedua masalah logika yang tercantum di atas. Baik deklarasi non publik maupun penyembunyian variabel anggota dengan menggunakan nama yang sama diteruskan sebagai internal.

Mengingat kita berbicara tentang variabel 'angka' sebagai contoh.

Di masa lalu seperti dalam variabel anggota c++ yang merupakan variabel internal pribadi akan diawali dengan 'm_number'. Atau beberapa hanya akan melakukan '_number'.

Hanya 'num' yang merupakan penggantian nama yang bagus tetapi mungkin tidak jelas apakah nilainya sama. Saya kira ini adalah masalah penamaan variabel anggota pribadi internal yang belum terselesaikan.

Python menggunakan 'self.number' yang akan membedakan dari 'number' yang diteruskan yang merupakan solusi yang layak.

Namun apa pun platformnya, ada baiknya untuk memiliki sistem penamaan anggota variabel pribadi yang membantu Anda menghindari peretasan jika terjadi benturan nama.

person Ryan Christensen    schedule 07.06.2009
comment
Memberi +1 pada gagasan umum. Namun, meskipun umum, Anda tidak boleh mengawali dengan garis bawah '_', karena standar mencadangkan nama tersebut ke 'implementasi', di mana implementasi adalah kompiler/implementor STL. Anda juga dapat menggunakan 'ini' di C++ seperti yang Anda lakukan 'mandiri' dengan python untuk membedakan atribut dari pengidentifikasi lain (variabel/parameter lokal). - person David Rodríguez - dribeas; 08.06.2009

Anda mendeklarasikan variabel lokal untuk fungsi yang menyembunyikan variabel anggota:

Kota(int nomor):nomor(nomor){};

Coba ini sebagai gantinya

Town(int num):number(num){};

person Hans    schedule 07.06.2009
comment
Daftar inisialisasi sedikit istimewa untuk efek ini. Parameter dengan nama yang sama tidak akan menyembunyikan atribut saat berada dalam daftar inisialisasi. Parameter akan menyembunyikan nama atribut jika memungkinkan. Ketika kompiler menemukan ': number(number)', 'number' pertama harus berupa atribut agar kode dapat dikompilasi. 'Angka' kedua dapat berupa salah satu dan parameter menyembunyikan atribut di sana (seperti di mana pun di dalam blok konstruktor). Tapi kode OPnya benar. - person David Rodríguez - dribeas; 07.06.2009