C++ 创建模板类并使用它从派生类返回指针

C++ 创建模板类并使用它从派生类返回指针,c++,C++,用一些评论介绍我的问题。每个注释都涉及以下代码: comment1:myShapeVector存储形状* comment2:将向量与圆形或矩形对象相加 comment3:returnPtr()成员函数用于返回圆*或矩形*,具体取决于传递的id,它用作将myShapeVector[i]元素(对象*)转换为圆*或矩形*的工具。我认为使用模板类是必要的,因为只有这些类才能返回不同的指针 注释4:另外,id用于表示向量的某个元素 注释5:通过静态转换将ShapePtr*转换为圆形*效果良好 comme

用一些评论介绍我的问题。每个注释都涉及以下代码:


comment1:myShapeVector存储形状*
comment2:将向量与圆形或矩形对象相加
comment3:returnPtr()成员函数用于返回圆*或矩形*,具体取决于传递的id,它用作将myShapeVector[i]元素(对象*)转换为圆*或矩形*的工具。我认为使用模板类是必要的,因为只有这些类才能返回不同的指针
注释4:另外,id用于表示向量的某个元素
注释5:通过静态转换将ShapePtr*转换为圆形*效果良好
comment6:此行返回一个错误。不知何故,returnPtr()没有返回预期的圆*。在我看来,模板类可以返回不同的指针*。T returnPtr(intid)在我看来很好

#包括
#包括
类形状{};
类圆:公共形状{};
类矩形:公共形状{};
模板类ShapeVector{
公众:
T returnPtr(int-id){//注释3
如果(id==0){
return(static_cast(myShapeVector[0]);//注释4
}else if(id==1){
返回(静态_cast(myShapeVector[1]);
}否则{
返回空ptr;
}
}
std::vector myShapeVector;//注释1
};
int main(){
我的形状;
myShapes.myShapeVector.push_back(新圆圈);//注释2
myShapes.myShapeVector.push_back(新矩形);
圆圈*b=myShapes.returnPtr(0);//注释6/请参见下面的错误
圆*c=static_cast(myShapes.myShapeVector[0]);//注释5
返回0;
}
当然,代码缺乏使用模板的知识

  • 在第一阶段,我主要关心的是如何从包含父类*的向量返回子类*
  • 此过程是否需要模板类

  • 最后,我找到了一个非常简单的解决方案,它与我在开始时的说明不同,这可能就是它令人困惑的原因。不需要模板类、类型转换、虚拟继承等。无论如何,我想发布一种方法来实现这一点:


    comment1:而不是只有一个向量并存储派生类对象。我刚刚创建了分离向量,一个用于圆,一个用于矩形。这些向量是形状对象的成员。
    comment2:为了以后访问某个矩形或圆形,我创建了一个枚举类型
    comment3:我使用重载运算符从形状对象返回特定数据类型
    注释4:我可以轻松访问myShapes中的某个对象(例如圆形、矩形)。因此,一个对象访问不同对象(圆、矩形)的规范是由成员变量完成的


    #包括
    #包括
    枚举矩形名称{rectangle1,rectangle2}//评论2
    enum CircleNames{circle1,circle2};
    类矩形;
    班级圈;
    类形状{
    公众:
    //评论3
    矩形*运算符[](矩形名称矩形名称){返回我的矩形[矩形名称];}
    Circle*运算符[](CircleNames circleName){返回myCircles[circleName];}
    std::vector my矩形;//注释1
    std::向量myCircles;
    };
    班级圈子{
    公众:
    内径;
    };
    类矩形{
    公众:
    整数宽度;
    整数长度;
    内部高度;
    };
    int main(){
    我的形状;
    myShapes.myRectangles.push_back(新矩形);
    myShapes.myCircles.push_back(新圆圈);
    myShapes[rectangle1]->高度=200;//注释4
    myShapes[矩形1]->长度=100;
    我的形状[矩形1]->宽度=40;
    myShapes[circle1]->直径=100;
    }
    
    >通过静态转换将ShapePtr*转换为Circle*效果很好
    -看起来效果很好,但您有可能出现未定义的行为。这是大量不必要的复杂和脆弱代码。一般来说,在你的设计中向上投射指针是不可取的,你甚至不需要模板来实现这一点。您应该改为使用
    virtual
    成员函数来实现继承层次结构中所需的功能。您是否介意更具体地解释一下这些
    Shape*
    指针要实现的功能?谢谢您的评论。其目的是使子类对象(例如圆、矩形)具有某些成员变量。例如,只有圆有直径,矩形有边长。这个想法是:1。有一个std::vector myShapes 2。用myShapes.pushback(新圆圈)3元素添加这个向量。通过mySHapes[0]->diameter之类的方式访问它;当然,现在myShapes只返回形状指针4。换句话说,我试图构建一个解决方案,以转换指定指针中未指定的myShape元素。相关:
    a value of type "Shape *" cannot be used to initialize an entity of type "Circle *" C/C++(144)
    invalid conversion from ‘Shape*’ to ‘Circle*’ [-fpermissive] gcc failure message