John Harrison wrote:
JoeC wrote:
I am crating a new version of my map game and my map will be a 2d
array. I had problems trying to create a 2d array dynamically, in
fact C++ won't let me do it. My question is how to create the size of
array I need at run time without using too much memory or going over
the allotted size if I choose to use this object for a different
game.
One idea I have is to create space * spaces = new space[len*with];
then have all my accessors just convert x and y to:
void place(int x, int y){spaces[x*len+y;}
You might want to put that into a class with an overloaded operator():
int & operator( std::size_t row, std::size_t col ) {
return ( the_data [ col_size * row + col ] );
}
and you could add a const version too:
int const & operator( std::size_t row, std::size_t col ) const {
return ( the_data [ col_size * row + col ] );
}
You also might make the member the_data a std::vector<int>. In that case,
you would not even have to take care of your own assignment operator, copy
constructor and destructor. E.g:. [code not tested/compiled]
template <typename T>
class array2d {
std::size_t the_row_size;
std::size_t the_col_size;
std::vector<T> the_data;
public:
array2d ( std::size_t r, std::size_t c, T const & val = T() )
: the_row_size ( r )
, the_col_size ( c )
, the_data ( the_row_size * the_col_size, val )
{}
T & operator( std::size_t row, std::size_t col ) {
return ( the_data [ the_col_size * row + col ] );
}
T const & operator( std::size_t row, std::size_t col ) const {
return ( the_data [ the_col_size * row + col ] );
}
std::size_t row_size ( void ) const {
return ( the_row_size );
}
std::size_t col_size ( void ) const {
return ( the_col_size );
}
};
Kai, you missed a pair of parens on both.