2

我是 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)?

4

3 回答 3

0

你需要扩展数组处理类吗?也许最好只使用 ClassA 和 ClassB 中的那个类。更喜欢组合而不是继承

你需要一个数组吗?正如其他人所说, std::vector 可能会更好。

如果您需要数组,您是否考虑过使用模板?类模板可以具有整数参数,例如

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

所以你可以从 PersonH​​andler<5> 继承 ClassA,从 PersonH​​andler<15> 继承 ClassB。但请注意,PersonClass 是 ClassA 和 ClassB 的不同类。

于 2012-06-29T21:01:24.403 回答
0

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

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

关于继承,如果classAis-a collection-ofPersonsclassBis-a collection-of Persons,则考虑public继承,如果行为不同的一组通用方法可以支持一组通用的前置条件和后置条件。例如,考虑一个Ellipseand Circle

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,就像 aSquare是一种特殊的Rectangle
  • 它们甚至具有相同的成员函数:width()height().

但是,不要这样做! Ellipse可以做Circle不能做的事情,例如具有不同的宽度和高度;因此Circle不应该是一种Ellipse

于 2012-06-29T21:10:07.920 回答
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)
    {
    }
};
于 2012-06-29T20:41:56.793 回答