NEED HELP with forward declarations

Discussion in 'C++' started by Alan Lee, Apr 5, 2004.

  1. Alan Lee

    Alan Lee Guest

    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[j] = 0; // initalizes board to 0
    // cout << boardarray[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[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;

    }
    Alan Lee, Apr 5, 2004
    #1
    1. Advertising

  2. Alan Lee

    Rolf Magnus Guest

    Alan Lee wrote:

    > 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);


    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.

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


    ....
    Rolf Magnus, Apr 5, 2004
    #2
    1. Advertising

  3. Alan Lee

    Alan Lee Guest

    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" <> wrote in message
    news:c4r7i4$ne5$05$-online.com...
    > Alan Lee wrote:
    >
    > > 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);

    >
    > 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.
    >
    > >
    > > private:
    > > int rcoord;
    > > int ccoord;
    > > int oldrcoord;
    > > int oldccoord;
    > >
    > > };

    >
    > ...
    >
    Alan Lee, Apr 5, 2004
    #3
  4. Alan Lee

    Alan Lee Guest

    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" <> wrote in message
    news:c4regi$m3b$...
    > Hi!
    >
    > "Alan Lee" <> writes:
    >
    > >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.

    >
    > 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
    Alan Lee, Apr 5, 2004
    #4
  5. Alan Lee

    Chris Dams Guest

    Hi!

    "Alan Lee" <> writes:

    >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.


    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
    Chris Dams, Apr 5, 2004
    #5
  6. Alan Lee

    Rolf Magnus Guest

    Please don't top-post.

    Alan Lee wrote:

    >> >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.

    >>
    >> 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.

    >
    > That worked great!
    > thanks for your help. I guess the memberfunctions need to know whats
    > passed to them.


    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.

    > Is this why people put things in header files?


    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.
    Rolf Magnus, Apr 5, 2004
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. matthew polder

    namespaces and forward declarations

    matthew polder, Jul 24, 2003, in forum: C++
    Replies:
    1
    Views:
    352
    John Harrison
    Jul 24, 2003
  2. mjm
    Replies:
    3
    Views:
    392
  3. whithers
    Replies:
    4
    Views:
    372
    Sumit Rajan
    Jan 16, 2004
  4. Steven T. Hatton

    forward declarations and namespaces?

    Steven T. Hatton, Apr 27, 2004, in forum: C++
    Replies:
    6
    Views:
    3,218
    Dave Moore
    May 5, 2004
  5. Marcin Kalicinski

    Forward declarations

    Marcin Kalicinski, May 11, 2004, in forum: C++
    Replies:
    2
    Views:
    5,685
    Jake Montgomery
    May 13, 2004
Loading...

Share This Page