首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在多角形设计中使用阵列

在多角形设计中使用阵列
EN

Stack Overflow用户
提问于 2013-09-04 12:33:51
回答 3查看 206关注 0票数 0

我刚开始真正理解多态性,但这对我来说还是一个新的话题。所以我的问题是:我必须上课,敌人和银行劫匪。然而,银行劫匪继承了敌人的财产。我试着做了10名银行抢劫犯。然后,一个全局函数应该使用数组的所有成员来做一些事情,我想这是一个毫无价值的描述,下面是代码:

代码语言:javascript
复制
void UpdateEnemies(Enemy * p_Enemy, int counter) { 
    for(unsigned int i = 0;i < counter;i++) { 
        p_Enemy[i].Update(); 
    } 
}

int main(void) { 
    BankRobber EnemyArray[10]; 
    Enemy * p_Enemy = new BankRobber(13,1); 
    UpdateEnemies(EnemyArray,10); 
    system("PAUSE"); 
};   

我为任何语言错误道歉。我不是说英语的人

我的实际问题是:这段代码只是为了练习,所以它的目的是在控制台上查看10次更新,用于数组的每个成员。因此,函数UpdateEnemys应该调用所有enemy.update函数。这种类型铸造的方法不完全是我想要的,因为它不再是动态的,因为以后会有更多的敌人。不仅仅是银行劫匪。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-04 12:46:57

像这样声明一个BankRobber数组

代码语言:javascript
复制
BankRobber EnemyArray[10];

而不是像这样通过基类指针来访问它们

代码语言:javascript
复制
Enemy * p_Enemy;    
p_Enemy[i].Update();

不起作用。这是因为索引数组p_Enemy[i]将通过使用offcet sizeof(Enemy)完成

但是sizeof(BankRobber)可能比sizeof(Enemy)大,所以p_Enemyi最终会在错误的地方结束

应该使用指针向量,如下所示

代码语言:javascript
复制
std::vector<Enemy*>

这样,如果将指向不同对象的指针添加到向量中,也可以使用多态。你不需要把丑陋的int counter传过来

票数 1
EN

Stack Overflow用户

发布于 2013-09-04 12:50:34

多态只适用于由基类的引用或指针访问的单个对象。它不适用于对象数组:要访问数组元素,必须知道元素大小,如果有指向基类的指针,则不是这样。

您需要额外的间接方向:指向单个对象的指针数组,按照

代码语言:javascript
复制
void UpdateEnemies(Enemy ** p_Enemy, int counter) { 
    for(unsigned int i = 0;i < counter;i++) { 
        p_Enemy[i]->Update(); 
    } 
}

int main() {
    // An array of Enemy base-class pointers
    Enemy * EnemyArray[10]; 

    // Populate with pointers to concrete Enemy types
    for (unsigned i = 0; i < 9; ++i) {
         EnemyArray[i] = new BankRobber;
    }

    // Of course, the array can contain pointers to different Enemy types
    EnemyArray[9] = new Dragon;

    // The function can act polymorphically on these
    UpdateEnemies(EnemyArray,10);

    // Don't forget to delete them. Enemy must have a virtual destructor.
    for (unsigned i = 0; i < 10; ++i) {
         delete EnemyArray[i];
    }
}

您还应该考虑使用雷伊类型(例如容器和智能指针)来管理这些动态资源;但这超出了这个问题的范围。

票数 2
EN

Stack Overflow用户

发布于 2013-09-04 12:45:03

事实上,你并没有说问题到底出在哪里。

你试过在你的代码中转换吗?类似于:

代码语言:javascript
复制
void UpdateEnemies(Enemy * p_Enemy, int counter) { 
    BankRobber *pRobber = (BankRobber*)p_Enemy;
    for(unsigned int i = 0;i < counter;i++) { 
        pRobber[i].Update(); 
    } 
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18613947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档