【问题标题】:How to identify elements in array or matrix and work with them correctly? c++如何识别数组或矩阵中的元素并正确使用它们? C++
【发布时间】:2021-12-11 05:39:32
【问题描述】:

首先,我有抽象父类:

class Abstract_class {
  virtual void Method1() {
   std::cout<<"Method1 of abstract class!\n";
  }
};

我也有一个子类

class Child1: public Abstract_class {
  void Method1() override {
    std::cout<<"Method1 of child1 class!\n";
  }
};

class Child2: public Abstract_class {
  void Method1() override {
    std::cout<<"Method1 of child2 class!\n";
  }
};

我的主要功能

int main(){
   Abstract_class ** arr = new Abstract_class * [10];
   for(int i=0; i<10; i++) {
    for(int j=0; j<10; j++) {
     Abstract_class * obj;
     // pseudo random rules for fill array
     if (i%2 == 0) {
       arr[i] = new Child1();
     }
     else {
       arr[i] = new Child2();
     }
    }
  }
}

现在,假设我对这个数组执行一些操作,引用元素,并且我需要知道对象所在的位置,这样就不会出现我期望 Method1 像在 child1 中那样执行的情况,但我得到了 child2 方法的完全不同的实现。 当然,你总是可以在类中添加字段来标识一个对象,但是我想要一些符合 OOP 规则的优雅的东西

UPD1:

所以,我意识到这种处理多态对象的方式是错误的。但是假设我们有一个特定的比赛场地,上面有不同的继承对象(盒子,敌人,玩家),如果它们是不同的类型,它们怎么可能在同一个场地上。我如何与他们互动?

【问题讨论】:

  • 多态性的关键点之一是函数使用多态类型不必必须知道它使用的是什么类型.有需要的代码可能是一个架构错误,并且违反了 LSP。
  • @Eljay 好的,我只是想不出更好的方法来存储具有不同元素的矩阵。假设我们有一个特定的运动场,上面有不同的继承对象(盒子、敌人、玩家),如果它们是不同的类型,他们怎么能在同一个场上呢?
  • 我提供的答案here 在由不同类型组成的表中利用了 CRTP 和 静态多态。 (答案有赞成票和反对票,所以它不是一个得到广泛认可的答案。可能回答离问题太远了,尽管 OP 很欣赏这个答案。)也许这种技术对你的程序。

标签: c++ class oop inheritance


【解决方案1】:

您可以为此使用动态转换:

Abstract_class *someObj = ...;
if(Child1 *c1 = dynamic_cast<Child1>(someObj)) {
    c1->specificChild1Func();
}

但是,您不应该需要这样的东西。多态性的关键在于您可以不知道底层类型是什么,但仍然可以使用它们。您正在寻找它的事实可能表明您需要进行设计。

【讨论】:

  • 是的,但是我怎样才能使用,比如说,一个领域(尽管可以玩),上面有不同类型的对象:玩家、敌人、盒子等。
  • @Sss 你想用那个字段做什么?碰撞检测之类的?在这种情况下,多态性应该可以满足您的要求。您应该在每个类上都有一些bool isCollisionDetected(),您可以使用多态性来调用正确的类。
猜你喜欢
  • 2019-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
相关资源
最近更新 更多