C ++类扩展(继承类中不同大小的数组)

时间:2012-06-29 19:56:47

标签: c++ inheritance

我是C ++的新手,我想得到一个建议。 我正在编写两个包含同一对象但具有不同大小的数组的类。这两个类都有相同的方法来处理数组,但每个类都有自己独特的行为。因此,我想创建一个新类来表示数组及其上的操作,并使这两个类扩展它。

例如:

Class classA{
     Person* persons[5];
     string className;
     ...
}

Class classB{
     Person* persons[15];
     int integerForClassB;
     string className;
     ...
}

定义类parentClass的最佳(建议)方式是什么,它只处理pesrons数组,classA将扩展parentClass(大小为5的数组),classB将扩展parentClass(大小数组) 15)?

3 个答案:

答案 0 :(得分:0)

这样的事情有帮助吗?使用Person类型的STL向量,可以使基类计算人数。然后,每个派生类都调用m_persons向量的不同大小的基类构造函数。然后,每种情况下的向量将使用默认初始化的Person实例填充到请求的大小。

包括

class Person
{
};

class ParentClass
{
public:
    // Relies on Person having a default constructor
    ParentClass( int personCount ) : m_persons( personCount )
    {
    } 

private:
    std::vector<Person> m_persons;
};

class ClassA : public ParentClass
{
public:
    ClassA() : ParentClass(5)
    {
    }
};

class ClassB : public ParentClass
{
public:
    ClassB() : ParentClass(15)
    {
    }
};

答案 1 :(得分:0)

您是否需要扩展数组处理类?也许最好只使用ClassA和ClassB中的类。 Prefer composition over inheritance

你需要一个阵列吗?正如其他人所说,std :: vector会更好。

如果您需要阵列,您是否考虑过使用模板?类模板可以包含整数参数,如

template <int npersons> class PersonHandler {
    Person* persons[npersons]
}

所以你可以从PersonH​​andler继承ClassA&lt; 5&gt; PersonH​​andler&lt; 15&gt;中的ClassB和ClassB。但请注意,PersonClass是ClassA和ClassB的不同类。

答案 2 :(得分:0)

基于这个问题,我的想法是最好的方式是不使用继承。使用public继承来定义类层次结构。使用它作为代码重用的手段时要非常谨慎,因为组合通常是优越的选择。

  • 根据评论中的建议,请考虑std::vector
  • 如果std::vector没有完成所有需要的操作,请检查<algorithms>是否满足您的需求。
  • 如果仍未满足您的需求,请考虑将收集操作编写为自由函数而不是成员函数。通过适当的解耦,这些操作可以在std::vector<Person>Person的数组上运行。
  • 如果您必须拥有具有非常特定行为的Persons集合,请使用合成。问题描述意味着构成是正确的:“包含两个数组的两个类......”

关于继承,如果classA是 - PersonsclassB的集合,是Persons的集合,那么请考虑public继承,如果一组常用方法,行为不同,可以坚持一套共同的前置条件和后置条件。例如,考虑EllipseCircle

class Ellipse
{
  // Set the width of the shape.
  virtual void width( unsigned int );

  // Set the height of the shape.
  virtual void height( unsigned int );
};

class Circle
{
  // Set the width of the shape.  If height is not the same as width, then
  // set height to be equal to width.
  virtual void width( unsigned int );

  // Set the height of the shape.  If width is not the same as height, then
  // set width to be equal to height.
  virtual void height( unsigned int );
};

Circle来自Ellipse

非常诱人
  • 在编程之外,有人可能会说Circle是一种特殊的Ellipse,就像Square是一种特殊的Rectangle一样。
  • 他们甚至拥有相同的会员功能:width()height()

但是,不要这样做! Ellipse可以执行Circle无法做到的事情,例如具有不同的宽度和高度;因此Circle不应该是Ellipse