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

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

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

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

如何創(chuàng)建異構(gòu)的對象集合?我想在一個(gè)中使用特征對象Vec。在C ++中我可以使一個(gè)基類Thing從中導(dǎo)出Monster1和Monster2。然后我可以創(chuàng)建一個(gè)std::vector<Thing*>。Thing對象必須存儲(chǔ)一些數(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,}我定義了一個(gè)ThingTrait與方法get_thing_record(),attack(),make_noise()等,并實(shí)現(xiàn)它們的Monster1和Monster2。
查看完整描述

1 回答

?
千巷貓影

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊

特質(zhì)對象

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

Vec<Box<dyn ThingTrait + 'static>>

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

Vec<Box<dyn ThingTrait + 'a>>

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

Vec<&dyn ThingTrait>

一個(gè)例子:

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ù)種類型上實(shí)現(xiàn)特征,但權(quán)衡是需要一定量的間接和動(dòng)態(tài)調(diào)度。

    枚舉

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

    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)注
    • 531 瀏覽

    添加回答

    舉報(bào)

    0/150
    提交
    取消
    微信客服

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

    幫助反饋 APP下載

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

    公眾號(hào)

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