Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > how to overload subscript of 2D-array

Reply
Thread Tools

how to overload subscript of 2D-array

 
 
DaVinci
Guest
Posts: n/a
 
      05-10-2006
/* how to overload the operation [] ,subscipt of 2D-array?
* how can I get element through piece[i][j],rather than piece(i)[j]?
* */
#include"global.h"
using namespace std;
class Piece
{
public:
Piece()
{
for(size_t i = 0;i<2;i++)
for(size_t j = 0;j<3;j++)
{
piece[i][j] = i+ j;
}
for(size_t i=0;i<2;i++)
{
std::copy(piece[i],piece[i]+3,ostream_iterator<int>(cout," "));
cout<<endl;
}
cout<<"----------------------"<<endl;
}
int* operator()(const int& t)//change operator() to operator[] is
wrong ,why?
{
i = t; //
return piece[i];
}
int operator[](const int & t)
{
return this->operator()(i)[t];
}
private:
int i;//witchout varible i,how can I implement overload the () , []
or[],[]
int piece[2][3];
};
//----------------------------------------
int main()
{
Piece p ;
for(int i=0;i<2;i++)
{
for(int j=0;j<3;j++)
{
cout<<p(i)[j]<<" ";//p[i][j],??
}
cout<<endl;
}
}
/*
//output is
0 1 2
1 2 3
----------------------
0 1 2
1 2 3
*/

 
Reply With Quote
 
 
 
 
Jonathan Mcdougall
Guest
Posts: n/a
 
      05-10-2006
DaVinci wrote:
> /* how to overload the operation [] ,subscipt of 2D-array?
> * how can I get element through piece[i][j],rather than piece(i)[j]?
> * */


This is a FAQ, http://www.parashift.com/c++-faq-lite/.


Jonathan

 
Reply With Quote
 
 
 
 
Axter
Guest
Posts: n/a
 
      05-10-2006
DaVinci wrote:
> /* how to overload the operation [] ,subscipt of 2D-array?
> * how can I get element through piece[i][j],rather than piece(i)[j]?
> * */
> #include"global.h"
> using namespace std;
> class Piece
> {
> public:
> Piece()
> {
> for(size_t i = 0;i<2;i++)
> for(size_t j = 0;j<3;j++)
> {
> piece[i][j] = i+ j;
> }
> for(size_t i=0;i<2;i++)
> {
> std::copy(piece[i],piece[i]+3,ostream_iterator<int>(cout," "));
> cout<<endl;
> }
> cout<<"----------------------"<<endl;
> }
> int* operator()(const int& t)//change operator() to operator[] is
> wrong ,why?
> {
> i = t; //
> return piece[i];
> }
> int operator[](const int & t)
> {
> return this->operator()(i)[t];
> }
> private:
> int i;//witchout varible i,how can I implement overload the () , []
> or[],[]
> int piece[2][3];
> };
> //----------------------------------------
> int main()
> {
> Piece p ;
> for(int i=0;i<2;i++)
> {
> for(int j=0;j<3;j++)
> {
> cout<<p(i)[j]<<" ";//p[i][j],??
> }
> cout<<endl;
> }
> }
> /*
> //output is
> 0 1 2
> 1 2 3
> ----------------------
> 0 1 2
> 1 2 3
> */



I recommend against using the method posted in the C++ FAQ.
It recommends you use a non-standard syntax.

If you want to use standard syntax check out the following link for an
example:
http://code.axter.com/dynamic_2d_array.h

However, for most requirements, I recommend using a vector of vector.
Example:
int col = 123;
int row = 456;
vector<vector<int> > My2dArray(col, vector<int>(row));


You can reference both the above vector code and the dynamic_2d_array
class using double index ([][])
My2dArray[0][0] = 99;

Check out the following link for wrapper classes using vector of
vector:
http://www.codeguru.com/forum/showthread.php?t=231046
http://www.codeguru.com/forum/showth...hreadid=297838

 
Reply With Quote
 
DaVinci
Guest
Posts: n/a
 
      05-10-2006

Axter wrote:

> DaVinci wrote:
> > /* how to overload the operation [] ,subscipt of 2D-array?
> > * how can I get element through piece[i][j],rather than piece(i)[j]?
> > * */
> > #include"global.h"
> > using namespace std;
> > class Piece
> > {
> > public:
> > Piece()
> > {
> > for(size_t i = 0;i<2;i++)
> > for(size_t j = 0;j<3;j++)
> > {
> > piece[i][j] = i+ j;
> > }
> > for(size_t i=0;i<2;i++)
> > {
> > std::copy(piece[i],piece[i]+3,ostream_iterator<int>(cout," "));
> > cout<<endl;
> > }
> > cout<<"----------------------"<<endl;
> > }
> > int* operator()(const int& t)//change operator() to operator[] is
> > wrong ,why?
> > {
> > i = t; //
> > return piece[i];
> > }
> > int operator[](const int & t)
> > {
> > return this->operator()(i)[t];
> > }
> > private:
> > int i;//witchout varible i,how can I implement overload the () , []
> > or[],[]
> > int piece[2][3];
> > };
> > //----------------------------------------
> > int main()
> > {
> > Piece p ;
> > for(int i=0;i<2;i++)
> > {
> > for(int j=0;j<3;j++)
> > {
> > cout<<p(i)[j]<<" ";//p[i][j],??
> > }
> > cout<<endl;
> > }
> > }
> > /*
> > //output is
> > 0 1 2
> > 1 2 3
> > ----------------------
> > 0 1 2
> > 1 2 3
> > */

>
>
> I recommend against using the method posted in the C++ FAQ.
> It recommends you use a non-standard syntax.
>
> If you want to use standard syntax check out the following link for an
> example:
> http://code.axter.com/dynamic_2d_array.h
>
> However, for most requirements, I recommend using a vector of vector.
> Example:
> int col = 123;
> int row = 456;
> vector<vector<int> > My2dArray(col, vector<int>(row));
>
>
> You can reference both the above vector code and the dynamic_2d_array
> class using double index ([][])
> My2dArray[0][0] = 99;
>
> Check out the following link for wrapper classes using vector of
> vector:
> http://www.codeguru.com/forum/showthread.php?t=231046
> http://www.codeguru.com/forum/showth...hreadid=297838


yes,I know vector<vector<int> > but here

The class Piece 's purpose 's isnot just for 2D-array,it was desiged to
support some other
operation such as void draw_grahic(),
void move_left() and so on.
But I must first Encapsulate the 2d-array int piece[2][3] as private
data.
and supply operator[][] to get it's data,
is there way to overload the operator[] twice to meet my need?

 
Reply With Quote
 
Jonathan Mcdougall
Guest
Posts: n/a
 
      05-10-2006
DaVinci wrote:
> The class Piece 's purpose 's isnot just for 2D-array,it was desiged to
> support some other
> operation such as void draw_grahic(),
> void move_left() and so on.
> But I must first Encapsulate the 2d-array int piece[2][3] as private
> data.
> and supply operator[][] to get it's data,
> is there way to overload the operator[] twice to meet my need?


If that's what you really want, just make an operator[] that returns a
proxy. Then, put another operator[] in that proxy that gives a value:

# include <vector>
# include <cstddef>

class test;

class proxy
{
friend class test;

public:
int operator[](std::size_t index)
{
return v_[index];
}

private:
proxy(std::vector<int>& v)
: v_(v)
{
}

std::vector<int>& v_;
};


class test
{
public:
proxy operator[](std::size_t index)
{
return proxy(v_[index]);
}

private:
std::vector< std::vector<int> > v_;
};

int main()
{
test t;
int i = t[1][2];
}

This is completly artificial, since std::vector already has a subscript
operator, but you should get the picture.


Jonathan

 
Reply With Quote
 
Axter
Guest
Posts: n/a
 
      05-10-2006

DaVinci wrote:
> Axter wrote:
>
> > DaVinci wrote:
> > > /* how to overload the operation [] ,subscipt of 2D-array?
> > > * how can I get element through piece[i][j],rather than piece(i)[j]?
> > > * */
> > > #include"global.h"
> > > using namespace std;
> > > class Piece
> > > {
> > > public:
> > > Piece()
> > > {
> > > for(size_t i = 0;i<2;i++)
> > > for(size_t j = 0;j<3;j++)
> > > {
> > > piece[i][j] = i+ j;
> > > }
> > > for(size_t i=0;i<2;i++)
> > > {
> > > std::copy(piece[i],piece[i]+3,ostream_iterator<int>(cout," "));
> > > cout<<endl;
> > > }
> > > cout<<"----------------------"<<endl;
> > > }
> > > int* operator()(const int& t)//change operator() to operator[] is
> > > wrong ,why?
> > > {
> > > i = t; //
> > > return piece[i];
> > > }
> > > int operator[](const int & t)
> > > {
> > > return this->operator()(i)[t];
> > > }
> > > private:
> > > int i;//witchout varible i,how can I implement overload the () , []
> > > or[],[]
> > > int piece[2][3];
> > > };
> > > //----------------------------------------
> > > int main()
> > > {
> > > Piece p ;
> > > for(int i=0;i<2;i++)
> > > {
> > > for(int j=0;j<3;j++)
> > > {
> > > cout<<p(i)[j]<<" ";//p[i][j],??
> > > }
> > > cout<<endl;
> > > }
> > > }
> > > /*
> > > //output is
> > > 0 1 2
> > > 1 2 3
> > > ----------------------
> > > 0 1 2
> > > 1 2 3
> > > */

> >
> >
> > I recommend against using the method posted in the C++ FAQ.
> > It recommends you use a non-standard syntax.
> >
> > If you want to use standard syntax check out the following link for an
> > example:
> > http://code.axter.com/dynamic_2d_array.h
> >
> > However, for most requirements, I recommend using a vector of vector.
> > Example:
> > int col = 123;
> > int row = 456;
> > vector<vector<int> > My2dArray(col, vector<int>(row));
> >
> >
> > You can reference both the above vector code and the dynamic_2d_array
> > class using double index ([][])
> > My2dArray[0][0] = 99;
> >
> > Check out the following link for wrapper classes using vector of
> > vector:
> > http://www.codeguru.com/forum/showthread.php?t=231046
> > http://www.codeguru.com/forum/showth...hreadid=297838

>
> yes,I know vector<vector<int> > but here
>
> The class Piece 's purpose 's isnot just for 2D-array,it was desiged to
> support some other
> operation such as void draw_grahic(),
> void move_left() and so on.
> But I must first Encapsulate the 2d-array int piece[2][3] as private
> data.
> and supply operator[][] to get it's data,
> is there way to overload the operator[] twice to meet my need?


Yes.
Did you look at the first link I posted?
http://code.axter.com/dynamic_2d_array.h

The above link doesn't use vector vector, and it's able to use
operator[] to return a 2D array without using a proxy class.

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: How include a large array? Edward A. Falk C Programming 1 04-04-2013 08:07 PM
How to overload Subscript operator pasa_1 C++ 2 08-09-2006 10:22 PM
function overload (not operator overload) Ying-Chieh Liao Perl Misc 3 10-11-2004 11:24 AM
Display superscript and subscript text in a label =?Utf-8?B?UmFuaSBQb25tYXRoaQ==?= Microsoft Certification 1 04-14-2004 12:39 PM
How use the overload of>> (or<<) of a class in the overload of << and >> of another class? Piotre Ugrumov C++ 3 01-25-2004 08:08 PM



Advertisments
 



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57