第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何創(chuàng)建異構(gòu)的對象集合?

如何創(chuàng)建異構(gòu)的對象集合?

如何創(chuàng)建異構(gòu)的對象集合?我想在一個中使用特征對象Vec。在C ++中我可以使一個基類Thing從中導(dǎo)出Monster1和Monster2。然后我可以創(chuàng)建一個std::vector<Thing*>。Thing對象必須存儲一些數(shù)據(jù),例如x : int, y : int,派生類需要添加更多數(shù)據(jù)。目前我有類似的東西struct Level {     // some stuff here     pub things: Vec<Box<ThingTrait + 'static>>,}struct ThingRecord {     x: i32,     y: i32,}struct Monster1 {     thing_record: ThingRecord,     num_arrows: i32,}struct Monster2 {     thing_record: ThingRecord,     num_fireballs: i32,}我定義了一個ThingTrait與方法get_thing_record(),attack(),make_noise()等,并實現(xiàn)它們的Monster1和Monster2。
查看完整描述

1 回答

?
千巷貓影

TA貢獻1829條經(jīng)驗 獲得超7個贊

特質(zhì)對象

實現(xiàn)對象的異構(gòu)集合(在本例中為向量)的最可擴展方式正是您所擁有的:

Vec<Box<dyn ThingTrait + 'static>>

雖然有些時候你可能想要一輩子沒有'static,所以你需要這樣的東西:

Vec<Box<dyn ThingTrait + 'a>>

您還可以擁有對特征的引用集合,而不是盒裝特征:

Vec<&dyn ThingTrait>

一個例子:

trait ThingTrait {
    fn attack(&self);}impl ThingTrait for Monster1 {
    fn attack(&self) {
        println!("monster 1 attacks")
    }}impl ThingTrait for Monster2 {
    fn attack(&self) {
        println!("monster 2 attacks")
    }}fn main() {
    let m1 = Monster1 {
        thing_record: ThingRecord { x: 42, y: 32 },
        num_arrows: 2,
    };

    let m2 = Monster2 {
        thing_record: ThingRecord { x: 42, y: 32 },
        num_fireballs: 65,
    };

    let things: Vec<Box<dyn ThingTrait>> = vec![Box::new(m1), Box::new(m2)];}

Box<SomeTrait>,Rc<SomeTrait>&SomeTrait等都是性狀的對象。這些允許在無數(shù)種類型上實現(xiàn)特征,但權(quán)衡是需要一定量的間接和動態(tài)調(diào)度。

    枚舉

    正如評論中所提到的,如果您有固定數(shù)量的已知替代方案,那么開放性較低的解決方案就是使用枚舉。這不需要Box編輯值,但它仍然會有少量的動態(tài)調(diào)度來決定運行時存在哪個具體的枚舉變量:

    enum Monster {
        One(Monster1),
        Two(Monster2),}impl Monster {
        fn attack(&self) {
            match *self {
                Monster::One(_) => println!("monster 1 attacks"),
                Monster::Two(_) => println!("monster 2 attacks"),
            }
        }}fn main() {
        let m1 = Monster1 {
            thing_record: ThingRecord { x: 42, y: 32 },
            num_arrows: 2,
        };
    
        let m2 = Monster2 {
            thing_record: ThingRecord { x: 42, y: 32 },
            num_fireballs: 65,
        };
    
        let things = vec![Monster::One(m1), Monster::Two(m2)];}


    查看完整回答
    反對 回復(fù) 2019-08-13
    • 1 回答
    • 0 關(guān)注
    • 532 瀏覽

    添加回答

    舉報

    0/150
    提交
    取消
    微信客服

    購課補貼
    聯(lián)系客服咨詢優(yōu)惠詳情

    幫助反饋 APP下載

    慕課網(wǎng)APP
    您的移動學(xué)習(xí)伙伴

    公眾號

    掃描二維碼
    關(guān)注慕課網(wǎng)微信公眾號