Connecting Tech Pros Worldwide Help | Site Map

NEED HELP with forward declarations

  #1  
Old July 22nd, 2005, 09:58 AM
Alan Lee
Guest
 
Posts: n/a
Hi i am writing a small simulation for a bunch of atoms jumping around on a
surface. I know i am a crappy programmer since i am not very familiar with
object oriented languages. I am woindering if anyone can tell me why my
forward class declarations not working.

the member function findpaths can't seem to access the class Board
when I try to pass it a board object by value.

I put the Board class latrerbut also put in a forward declaration before
the ATOM class.

please someone tell me why the memberfunction in class atom still can't see
the board class. I made them friends of each other also. i am going crazy
trying to figure it out. thanks. here
is the relevant portions of the code:

#include <iostream>
using std::cout;
using std::endl;
using std::fixed;
using std::left;

#include <iomanip>

using std::setw;
using std::setprecision;

#include <cstdlib> // contains function protype for rand
#include <stdlib.h> // for pausing function
// class Atom; // forward declaration
#include <vector>
using std::vector;

const int Boardsize=4;

class Board;



class Atom {
friend class Board;

public:
Atom(int,int); // constructor
void findpaths(Board b);

private:
int rcoord;
int ccoord;
int oldrcoord;
int oldccoord;

};

Atom::Atom(int r,int c)
{
rcoord = r;
ccoord = c;
}

void Atom::findpaths(Board b)
{

int northr,southr,westr,eastr;
int northc,southc,westc,eastc;


//define coordinates of neighbors taking into account atoms on edge of
board
//north
if (rcoord==0){
northr=Boardsize-1;}
else {
northr=rcoord-1;
}
northc=ccoord;
//south
if (rcoord==Boardsize-1){
southr=0;}
else {
southr=rcoord + 1;
}
southc=ccoord;
//east
if (ccoord==Boardsize-1){
eastc=0;}
else {
eastc=ccoord+1;
}
eastr=rcoord;
//west
if (ccoord==0){
westc=Boardsize-1;}
else {
westc=ccoord-1;
}
westr=rcoord;


}



class Board {
friend class Atom;

public:
Board();
int getneighbors( int r, int c);
void drawboard(); // draws board
void placeatom(int,int); // places atom on board

void update(Atom a);
private:

int boardarray[Boardsize][Boardsize];
};


Board::Board()


{


for (int i= 0; i < Boardsize; i++)
for (int j=0; j < Boardsize; j++)
{ boardarray[i][j] = 0; // initalizes board to 0
// cout << boardarray[i][j];

}
}

void Board::update(Atom a)
{
// int row,column, oldrow, oldcolumn;

// oldrow=(a.oldycoord)-1;
// oldcolumn=(a.oldxcoord)-1;
// row=a.ycoord - 1;
// column= a.xcoord -1;

// note that this is the relationship
// between boardarray coordinates
// and cartesian



boardarray[a.oldrcoord][a.oldccoord] = 0; // set old position to 0
boardarray[a.rcoord][a.ccoord] = 1; // set new position to 1

cout << "old position" << a.oldrcoord << a.oldccoord << "\n";
cout << "new position" << a.rcoord<< a.ccoord<<"\n";
}



void Board::drawboard()
{

// boardarray[1][3] = 1;


for (int i= 0; i < Boardsize; i++)
{ cout << "\n" ;
for (int j=0; j < Boardsize; j++)
cout << setw(2) << boardarray[i][j];
}

}


void Board::placeatom( int x, int y )
{
boardarray[x][y] = 1; //again, this is board coordinates
//we have to convert from cartesian
}

int Board::getneighbors( int r, int c)
{
// works fine
int totalneighbors=0;
int northr,southr,westr,eastr;
int northc,southc,westc,eastc;




//define coordinates of neighbors taking into account atoms on edge of board


//if space where neighbor check is done occupied, then return 99 othewise
returns
//number of nearest neighbors
if (boardarray[r][c]==1){
totalneighbors=99;}
else{


//north
if (r==0){
northr=Boardsize-1;}
else {
northr=r-1;
}
northc=c;
//south
if (r==Boardsize-1){
southr=0;}
else {
southr=r + 1;
}
southc=c;
//east
if (c==Boardsize-1){
eastc=0;}
else {
eastc=c+1;
}
eastr=r;
//west
if (c==0){
westc=Boardsize-1;}
else {
westc=c-1;
}
westr=r;


// tallies total neighbors

if (boardarray[northr][northc]==1){ // if there is an atom north add 1 to
neighbor
totalneighbors++;
}
if (boardarray[southr][southc]==1){
totalneighbors++;
}
if (boardarray[eastr][eastc]==1){
totalneighbors++;
}
if (boardarray[westr][westc]==1){
totalneighbors++;
}
}

return totalneighbors;

}




  #2  
Old July 22nd, 2005, 09:58 AM
Rolf Magnus
Guest
 
Posts: n/a

re: NEED HELP with forward declarations


Alan Lee wrote:
[color=blue]
> Hi i am writing a small simulation for a bunch of atoms jumping around
> on a surface. I know i am a crappy programmer since i am not very
> familiar with object oriented languages. I am woindering if anyone
> can tell me why my forward class declarations not working.
>
> the member function findpaths can't seem to access the class Board
> when I try to pass it a board object by value.
>
> I put the Board class latrerbut also put in a forward declaration
> before the ATOM class.
>
> please someone tell me why the memberfunction in class atom still
> can't see
> the board class. I made them friends of each other also. i am going
> crazy
> trying to figure it out. thanks. here
> is the relevant portions of the code:
>
> #include <iostream>
> using std::cout;
> using std::endl;
> using std::fixed;
> using std::left;
>
> #include <iomanip>
>
> using std::setw;
> using std::setprecision;
>
> #include <cstdlib> // contains function protype for rand
> #include <stdlib.h> // for pausing function
> // class Atom; // forward declaration
> #include <vector>
> using std::vector;
>
> const int Boardsize=4;
>
> class Board;
>
>
>
> class Atom {
> friend class Board;
>
> public:
> Atom(int,int); // constructor
> void findpaths(Board b);[/color]

You're passing the Board by value, i.e. as copy. You can only use
pointers and references to Board if that class is only forward
declared.
[color=blue]
>
> private:
> int rcoord;
> int ccoord;
> int oldrcoord;
> int oldccoord;
>
> };[/color]

....

  #3  
Old July 22nd, 2005, 09:58 AM
Chris Dams
Guest
 
Posts: n/a

re: NEED HELP with forward declarations


Hi!

"Alan Lee" <alanlee@stanford.edu> writes:
[color=blue]
>Hi i am writing a small simulation for a bunch of atoms jumping around on a
>surface. I know i am a crappy programmer since i am not very familiar with
>object oriented languages. I am woindering if anyone can tell me why my
>forward class declarations not working.[/color]

Because before declaring a variable of a class the compiler wants to
know what is in your class. Just put the definition of class Board right
after the definition of class Atom and you should be fine. Definitions
of Member functions that take Board or Atom type arguments should come
after these classes have been defined.

Bye,
Chris Dams
  #4  
Old July 22nd, 2005, 09:58 AM
Chris Dams
Guest
 
Posts: n/a

re: NEED HELP with forward declarations


Hi!

"Alan Lee" <alanlee@stanford.edu> writes:
[color=blue]
>Hi i am writing a small simulation for a bunch of atoms jumping around on a
>surface. I know i am a crappy programmer since i am not very familiar with
>object oriented languages. I am woindering if anyone can tell me why my
>forward class declarations not working.[/color]

Because before declaring a variable of a class the compiler wants to
know what is in your class. Just put the definition of class Board right
after the definition of class Atom and you should be fine. Definitions
of Member functions that take Board or Atom type arguments should come
after these classes have been defined.

Bye,
Chris Dams
  #5  
Old July 22nd, 2005, 09:58 AM
Alan Lee
Guest
 
Posts: n/a

re: NEED HELP with forward declarations


thanks for the reply,

So by what you are saying, if I pass the board by reference, ie (Board
&b), everything should work fine?
if not, How would I get around this problem? thanks


"Rolf Magnus" <ramagnus@t-online.de> wrote in message
news:c4r7i4$ne5$05$2@news.t-online.com...[color=blue]
> Alan Lee wrote:
>[color=green]
> > Hi i am writing a small simulation for a bunch of atoms jumping around
> > on a surface. I know i am a crappy programmer since i am not very
> > familiar with object oriented languages. I am woindering if anyone
> > can tell me why my forward class declarations not working.
> >
> > the member function findpaths can't seem to access the class Board
> > when I try to pass it a board object by value.
> >
> > I put the Board class latrerbut also put in a forward declaration
> > before the ATOM class.
> >
> > please someone tell me why the memberfunction in class atom still
> > can't see
> > the board class. I made them friends of each other also. i am going
> > crazy
> > trying to figure it out. thanks. here
> > is the relevant portions of the code:
> >
> > #include <iostream>
> > using std::cout;
> > using std::endl;
> > using std::fixed;
> > using std::left;
> >
> > #include <iomanip>
> >
> > using std::setw;
> > using std::setprecision;
> >
> > #include <cstdlib> // contains function protype for rand
> > #include <stdlib.h> // for pausing function
> > // class Atom; // forward declaration
> > #include <vector>
> > using std::vector;
> >
> > const int Boardsize=4;
> >
> > class Board;
> >
> >
> >
> > class Atom {
> > friend class Board;
> >
> > public:
> > Atom(int,int); // constructor
> > void findpaths(Board b);[/color]
>
> You're passing the Board by value, i.e. as copy. You can only use
> pointers and references to Board if that class is only forward
> declared.
>[color=green]
> >
> > private:
> > int rcoord;
> > int ccoord;
> > int oldrcoord;
> > int oldccoord;
> >
> > };[/color]
>
> ...
>[/color]


  #6  
Old July 22nd, 2005, 09:58 AM
Alan Lee
Guest
 
Posts: n/a

re: NEED HELP with forward declarations


thanks for the reply,

So by what you are saying, if I pass the board by reference, ie (Board
&b), everything should work fine?
if not, How would I get around this problem? thanks


"Rolf Magnus" <ramagnus@t-online.de> wrote in message
news:c4r7i4$ne5$05$2@news.t-online.com...[color=blue]
> Alan Lee wrote:
>[color=green]
> > Hi i am writing a small simulation for a bunch of atoms jumping around
> > on a surface. I know i am a crappy programmer since i am not very
> > familiar with object oriented languages. I am woindering if anyone
> > can tell me why my forward class declarations not working.
> >
> > the member function findpaths can't seem to access the class Board
> > when I try to pass it a board object by value.
> >
> > I put the Board class latrerbut also put in a forward declaration
> > before the ATOM class.
> >
> > please someone tell me why the memberfunction in class atom still
> > can't see
> > the board class. I made them friends of each other also. i am going
> > crazy
> > trying to figure it out. thanks. here
> > is the relevant portions of the code:
> >
> > #include <iostream>
> > using std::cout;
> > using std::endl;
> > using std::fixed;
> > using std::left;
> >
> > #include <iomanip>
> >
> > using std::setw;
> > using std::setprecision;
> >
> > #include <cstdlib> // contains function protype for rand
> > #include <stdlib.h> // for pausing function
> > // class Atom; // forward declaration
> > #include <vector>
> > using std::vector;
> >
> > const int Boardsize=4;
> >
> > class Board;
> >
> >
> >
> > class Atom {
> > friend class Board;
> >
> > public:
> > Atom(int,int); // constructor
> > void findpaths(Board b);[/color]
>
> You're passing the Board by value, i.e. as copy. You can only use
> pointers and references to Board if that class is only forward
> declared.
>[color=green]
> >
> > private:
> > int rcoord;
> > int ccoord;
> > int oldrcoord;
> > int oldccoord;
> >
> > };[/color]
>
> ...
>[/color]


  #7  
Old July 22nd, 2005, 09:58 AM
Alan Lee
Guest
 
Posts: n/a

re: NEED HELP with forward declarations


That worked great!
thanks for your help. I guess the memberfunctions need to know whats passed
to them. Is this why people put things in header files?
anyways, I am very thankful for your advice.

"Chris Dams" <chrisd@gamow.sci.kun.nl> wrote in message
news:c4regi$m3b$1@gamow.sci.kun.nl...[color=blue]
> Hi!
>
> "Alan Lee" <alanlee@stanford.edu> writes:
>[color=green]
> >Hi i am writing a small simulation for a bunch of atoms jumping around on[/color][/color]
a[color=blue][color=green]
> >surface. I know i am a crappy programmer since i am not very familiar[/color][/color]
with[color=blue][color=green]
> >object oriented languages. I am woindering if anyone can tell me why my
> >forward class declarations not working.[/color]
>
> Because before declaring a variable of a class the compiler wants to
> know what is in your class. Just put the definition of class Board right
> after the definition of class Atom and you should be fine. Definitions
> of Member functions that take Board or Atom type arguments should come
> after these classes have been defined.
>
> Bye,
> Chris Dams[/color]


  #8  
Old July 22nd, 2005, 09:58 AM
Alan Lee
Guest
 
Posts: n/a

re: NEED HELP with forward declarations


That worked great!
thanks for your help. I guess the memberfunctions need to know whats passed
to them. Is this why people put things in header files?
anyways, I am very thankful for your advice.

"Chris Dams" <chrisd@gamow.sci.kun.nl> wrote in message
news:c4regi$m3b$1@gamow.sci.kun.nl...[color=blue]
> Hi!
>
> "Alan Lee" <alanlee@stanford.edu> writes:
>[color=green]
> >Hi i am writing a small simulation for a bunch of atoms jumping around on[/color][/color]
a[color=blue][color=green]
> >surface. I know i am a crappy programmer since i am not very familiar[/color][/color]
with[color=blue][color=green]
> >object oriented languages. I am woindering if anyone can tell me why my
> >forward class declarations not working.[/color]
>
> Because before declaring a variable of a class the compiler wants to
> know what is in your class. Just put the definition of class Board right
> after the definition of class Atom and you should be fine. Definitions
> of Member functions that take Board or Atom type arguments should come
> after these classes have been defined.
>
> Bye,
> Chris Dams[/color]


  #9  
Old July 22nd, 2005, 09:58 AM
Rolf Magnus
Guest
 
Posts: n/a

re: NEED HELP with forward declarations


Please don't top-post.

Alan Lee wrote:
[color=blue][color=green][color=darkred]
>> >Hi i am writing a small simulation for a bunch of atoms jumping
>> >around on a surface. I know i am a crappy programmer since i am not
>> >very familiar with object oriented languages. I am woindering if
>> >anyone can tell me why my forward class declarations not working.[/color]
>>
>> Because before declaring a variable of a class the compiler wants to
>> know what is in your class. Just put the definition of class Board
>> right after the definition of class Atom and you should be fine.
>> Definitions of Member functions that take Board or Atom type
>> arguments should come after these classes have been defined.[/color]
>
> That worked great!
> thanks for your help. I guess the memberfunctions need to know whats
> passed to them.[/color]

Yes. If the object is passed by value, a local copy needs to be made for
the function, and then the compiler needs to know e.g. how big the
object is and if it is actually allowed to be copied. It can't get that
information from a forward declaration.
[color=blue]
> Is this why people put things in header files?[/color]

More or less, yes. If you pass by pointer or reference (which you should
actually prefer if you don't need it to be copied), the compiler
doesn't need to know any details about the class - only that it exists.
But later, where the funciton is implemented, you probably want to call
member functions on the object and things like that. Then the compiler
needs to know the full class definition. So you have to #include its
header in the file where your function implementation is written down.


  #10  
Old July 22nd, 2005, 09:59 AM
Rolf Magnus
Guest
 
Posts: n/a

re: NEED HELP with forward declarations


Please don't top-post.

Alan Lee wrote:
[color=blue][color=green][color=darkred]
>> >Hi i am writing a small simulation for a bunch of atoms jumping
>> >around on a surface. I know i am a crappy programmer since i am not
>> >very familiar with object oriented languages. I am woindering if
>> >anyone can tell me why my forward class declarations not working.[/color]
>>
>> Because before declaring a variable of a class the compiler wants to
>> know what is in your class. Just put the definition of class Board
>> right after the definition of class Atom and you should be fine.
>> Definitions of Member functions that take Board or Atom type
>> arguments should come after these classes have been defined.[/color]
>
> That worked great!
> thanks for your help. I guess the memberfunctions need to know whats
> passed to them.[/color]

Yes. If the object is passed by value, a local copy needs to be made for
the function, and then the compiler needs to know e.g. how big the
object is and if it is actually allowed to be copied. It can't get that
information from a forward declaration.
[color=blue]
> Is this why people put things in header files?[/color]

More or less, yes. If you pass by pointer or reference (which you should
actually prefer if you don't need it to be copied), the compiler
doesn't need to know any details about the class - only that it exists.
But later, where the funciton is implemented, you probably want to call
member functions on the object and things like that. Then the compiler
needs to know the full class definition. So you have to #include its
header in the file where your function implementation is written down.


Closed Thread


Similar Threads
Thread Thread Starter Forum Replies Last Post
NEED HELP with forward declarations Alan Lee answers 1 July 22nd, 2005 09:58 AM
NEED HELP with forward declarations Alan Lee answers 10 July 22nd, 2005 09:29 AM