เวกเตอร์ของวัตถุจากคลาสที่แตกต่างกัน

ฉันกำลังพยายามสร้างเวกเตอร์ที่มีวัตถุจากคลาสที่แตกต่างกัน ซึ่งได้มาจากคลาสพื้นฐาน การติดตามคำตอบของคำถามนี้ ฉันมีรหัสต่อไปนี้ซึ่งลองใช้สี่วิธีที่แตกต่างกัน (แสดงความคิดเห็นด้านล่าง); ไม่มีสิ่งใดที่จะรวบรวม:

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


};

มีความคิดอะไรบ้าง?


person jorgen    schedule 21.06.2015    source แหล่งที่มา
comment
ข้อผิดพลาดในการคอมไพล์ในแต่ละกรณีมีอะไรบ้าง   -  person Oliver Charlesworth    schedule 21.06.2015


คำตอบ (2)


ตัวเลือก 1 ไม่สามารถทำงานได้เนื่องจาก obs คือ vector<observable*>^ คุณไม่สามารถผลักวัตถุประเภท observable ได้ เนื่องจากคุณสามารถจัดเก็บพอยน์เตอร์ (observable*) ไว้ในนั้นได้เท่านั้น คุณสามารถจัดเก็บวัตถุดังกล่าวใน vector<observable> ได้ แต่คุณไม่สามารถจัดเก็บวัตถุ Energy ในเวกเตอร์ดังกล่าวได้

ตัวเลือก 2 ไม่สามารถทำงานได้เนื่องจาก obs คือ vector<observable*>^ คุณไม่สามารถพุชออบเจ็กต์ประเภท std::shared_ptr<observable> ได้ เนื่องจากคุณสามารถเก็บได้เฉพาะพอยน์เตอร์ ดิบ (observable*) ในนั้นเท่านั้น หากต้องการจัดเก็บพอยน์เตอร์ที่แชร์ เวกเตอร์ต้องเป็นประเภท vector<shared_ptr<observable>>

ตัวเลือกที่ 3 มีผลเหมือนกับตัวเลือกที่ 4 ซึ่งจะได้ผลหากคุณพยายามพุชเข้าไปในตัวแปรสมาชิก obj อย่างไรก็ตาม คุณได้ซ่อนตัวแปรนั้นด้วยการประกาศตัวแปรภายในเครื่องด้วยชื่อเดียวกัน (พารามิเตอร์ฟังก์ชัน) คุณไม่สามารถกด observable* ลงในเวกเตอร์ของสตริงได้ ข้อผิดพลาดในการคอมไพล์ควรมีความชัดเจนเกี่ยวกับเรื่องนี้ หากคุณตั้งใจที่จะพุชเข้าไปในตัวแปรสมาชิก คุณสามารถใช้ this->obs แทน หรือดีกว่านั้น ให้ใช้ชื่ออื่นสำหรับตัวแปรโลคัล

^สมมติว่าคุณกำลังผลักดันเข้าสู่ this->obs แทนที่จะเป็นตัวแปรท้องถิ่น

person eerorika    schedule 21.06.2015

คุณกำลังส่งผ่าน vector obs (เรียกว่าเหมือนกับสมาชิก) และคุณกำลังพยายามผลักดันชั้นเรียนของคุณไปให้ถึงจุดนั้น หากคุณต้องการส่งไปยังสมาชิกให้ใช้ this.obs.push_back()

person PiotrSliwa    schedule 21.06.2015