我是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)?
答案 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]
}
所以你可以从PersonHandler继承ClassA&lt; 5&gt; PersonHandler&lt; 15&gt;中的ClassB和ClassB。但请注意,PersonClass是ClassA和ClassB的不同类。
答案 2 :(得分:0)
基于这个问题,我的想法是最好的方式是不使用继承。使用public
继承来定义类层次结构。使用它作为代码重用的手段时要非常谨慎,因为组合通常是优越的选择。
std::vector
。std::vector
没有完成所有需要的操作,请检查<algorithms>
是否满足您的需求。std::vector<Person>
或Person
的数组上运行。Persons
集合,请使用合成。问题描述意味着构成是正确的:“包含两个数组的两个类......”关于继承,如果classA
是 - Persons
和classB
的集合,是Persons
的集合,那么请考虑public
继承,如果一组常用方法,行为不同,可以坚持一套共同的前置条件和后置条件。例如,考虑Ellipse
和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
,就像Square
是一种特殊的Rectangle
一样。width()
和height()
。但是,不要这样做! Ellipse
可以执行Circle
无法做到的事情,例如具有不同的宽度和高度;因此Circle
不应该是Ellipse
。