Vektor objek dari kelas yang berbeda

Saya mencoba membuat vektor yang berisi objek dari kelas berbeda, berasal dari kelas dasar. Mengikuti jawaban untuk pertanyaan ini Saya memiliki kode berikut yang mencoba empat cara berbeda (berkomentar di bawah); tidak ada satupun yang akan dikompilasi:

class observable {

    public:
    virtual void observe(alglib::complex_1d_array)=0;

    observable() {

    }
};

class Energy : public observable {

    public:
    void observe(alglib::complex_1d_array);

    Energy() {

    }
};

class ObservableCollection {

    private:
    int no_obs;
    vector<observable*> obs;

    public:

    ObservableCollection(vector<string> obs) {
        no_obs=obs.size();
        for(int i=0;i<no_obs;i++) {
            if(!strcmp(obs[i].c_str(), "energy")) {
                // option 1:
                // Energy E();
                // obs.push_back(E);

                // option 2:
                // obs.push_back<std::shared_ptr<observable>(new Energy())>;

                // option 3:
                // obs.push_back(new Energy());

                // option 4:
                // observable *E=new Energy();
                // obs.push_back(E);
            }
        }
    }


};

Ada ide?


person jorgen    schedule 21.06.2015    source sumber
comment
Apa kesalahan kompilasi pada setiap kasus?   -  person Oliver Charlesworth    schedule 21.06.2015


Jawaban (2)


Opsi 1 tidak dapat berfungsi karena obs adalah vector<observable*>^. Anda tidak dapat mendorong objek bertipe observable karena Anda hanya dapat menyimpan pointer (observable*) di dalamnya. Anda dapat menyimpan objek seperti itu di vector<observable> tetapi Anda tidak dapat menyimpan objek Energy di vektor tersebut.

Opsi 2 tidak dapat berfungsi karena obs adalah vector<observable*>^. Anda tidak dapat mendorong objek bertipe std::shared_ptr<observable> karena Anda hanya dapat menyimpan pointer mentah (observable*) di dalamnya. Untuk menyimpan pointer bersama, vektor harus bertipe vector<shared_ptr<observable>>.

Opsi 3 secara efektif sama dengan opsi 4. Opsi ini akan berfungsi jika Anda benar-benar mencoba memasukkan variabel anggota obj. Namun, Anda telah menyembunyikan variabel tersebut dengan mendeklarasikan variabel lokal dengan nama yang sama (parameter fungsi). Anda tidak dapat memasukkan observable* ke dalam vektor string. Kesalahan kompilasi harus jelas tentang hal ini. Jika Anda ingin memasukkan variabel anggota, Anda dapat menggunakan this->obs sebagai gantinya, atau lebih baik lagi, gunakan nama yang berbeda untuk variabel lokal.

^Dengan asumsi Anda benar-benar memasukkan ke this->obs daripada variabel lokal.

person eerorika    schedule 21.06.2015

Anda meneruskan obs vektor (disebut sama dengan anggota) dan Anda mencoba mendorong kelas Anda ke sana. Jika Anda ingin melakukan push ke anggota, gunakan this.obs.push_back().

person PiotrSliwa    schedule 21.06.2015