=?windows-1252?Q?Re=3A_Copy_vector's_functions_into_your_own_class?=
On Sep 15, 1:49 am, Immortal Nephi <Immortal_Ne...@hotmail.com> wrote:
I want to design three different classes. Three classes'
names are Array_1D, Array_2D and Array_3D. Array_1D has all
elements in column. Array_2D enchances Array_1D by adding row
like matrix. Also, Array_3D enchanges Array_2D by adding
plane like cube.
I wonder if I don't like to define vector like below.
vector< int > Array_1D;
vector< vector< int > > Array_2D;
vector< vector< vector< int > > > Array_3D;
It is so confusing to me. I prefer to use only one vector.
That's usually the preferred solution, but which is better may
depend on the C++ implementation.
At any rate, you doubtlessly want to hide this implementation
detail; the typedef's (if used) should be private, in the class.
I can add data members to that class like column, row, plane.
To which class? I'm not sure what you mean here.
template< typename element_type >
class Array_1D {
public:
typedef typename vector< element_type >::size_type size_type;
Just use size_t and be done with it.
Array_1D() {}
Array_1D( size_type column ) : m_column( column ) {
m_data.resize( column );
}
private:
vector< element_type > m_data;
size_type m_column;
You don't actually need this one. It's m_data.size().
};
template< typename element_type >
class Array_2D : public Array_1D< element_type > {
This is a serious design error. An Array_2D is not an Array_1D.
Inheritance is a poor choice here; you have two unrelated types.
(You likely do want to provide functions in Array_2D which
returns a given row or column, as an Array_1D.)
[...]
template< typename element_type >
class Array_3D : public Array_2D< element_type > {
As above. This is very poor design.
[...]
Do you see that three classes are clean readable code?
No. The inheritance is all wrong.
If I want to add some vector's functions into my own class,
I would write my own function like begin(), end(), clear,
empty, resize. They behave differently because they are not
the same as vector's functions.
Also, I add Insert_Column, Insert_Row, Insert_Plane,
Remove_Column, Remove_Row, Remove_Plane functions.
I don't use inheritance to override vector's function. I use
composition and write my own functions.
Yes. Since you don't (or shouldn't) derive from vector, you
have to provide your own.
My question is =96 is it ok if I write my own functions which they
behave like vector's functionality?
Why not?
Also, I can write my own copy constructor and assignment
operator.
You can, but you probably don't have to; the compiler generated
defaults will do the right thing (as long as the only members
are std::vector and the size types). You might want to,
however, to ensure that they aren't inline.
--
James Kanze