Archived

This topic is now archived and is closed to further replies.

Problem with my OO program

This topic is 5152 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I am quite new to the concept of OO programming. I am having trouble with my code, and not sure how to correct it. I'll be very very gratefull if you can help me. My code is supposed to simulate two sets of traffic lights in a traffic junction. There are two classes "trafficJunction" and "trafficLight". "trafficJunction" is in charge of controlling the traffic lights and "trafficLight" contains the attributes of traffic lights. The problem starts when I create two objects of type trafficLight in trafficJunction. These objects are NS_bound and EW_bound (look in the header file for trafficJunction below). below is the header file for trafficJunction
#include <iostream>
#include "trafficLight.h"
using namespace std;


class trafficJunction {
private:
  char Name1[20];
  char Name2[20];
  trafficLight* NS_bound ;
  trafficLight* EW_bound;

 public:
  trafficJunction(char T1Name[], char T2Name[]);
  void carWantsToCross(char side);
  void change_to_green(char bound);
  void change_to_red(char bound);

};
This is the implementation file for it
  
#include <iostream>
#include "trafficJunction.h"


using namespace std;


trafficJunction::trafficJunction(char T1Name[], char T2Name[])
{
  strcpy(Name1,T1Name);
  strcpy(Name2,T2Name);
  NS_bound = new trafficLight(Name1, 1);
  EW_bound = new trafficLight(Name2, 1);

}


void trafficJunction::carWantsToCross(char side)
{
  if ( (side == 'N') || (side == 'S') )
    if (NS_bound.colour == 1) change_to_green('N');
  else {
    if (EW_bound.colour == 1) change_to_green('E');
  }
}


void trafficJunction::change_to_green(char bound) {
  switch (bound)
    {
    case 'N':
      {
	if(EW_bound.colour == 1) {
	  NS_bound.change_colour(2);
	  NS_bound.change_colour(3);
	}
	else if (EW_bound.colour == 3) change_to_red("EW");
	else NS_bound.change_colour(3);
      }
      break;

    case 'E':
      {
	if(NS_bound.colour == 1) {
	  EW_bound.change_colour(2);
	  EW_bound.change_colour(3);
	}
	else if (NS_bound.colour == 3) change_to_red('N');
	else EW_bound.change_colour(3);
      }
      break;
      }
}


void trafficJunction::change_to_red(char bound) {
  switch(bound)
    {
    case 'N':
      {
	if(NS_bound.colour == 3) {
	  NS_bound.colour(2);
	  change_to_green('E');
	}

	if(NS_bound.colour == 2) {
	  NS_bound.change_colour(1);
	  change_to_green('E');
	}
      } break;

    case 'E':
      {
	if(EW_bound.colour == 3) {
	  EW_bound.colour(2);
	  change_to_green('N');
	}

	if(EW_bound.colour == 2) {
	  EW_bound.change_colour(1);
	  change_to_green('N');
	}
      } break;
    }
}
for your information these are the trafficLight's header and implementation files:
   
#include <iostream>
using namespace std;


class trafficLight {
  private:
  char name[20];
  int colour;
  
 public:

  trafficLight(char TLname[], int TLcolour);
  void change_colour(int Tcolour);
};
trafficLight.cpp
   
#include <iostream>
#include "trafficLight.h"

using namespace std;


trafficLight::trafficLight(char TLname[], int TLcolour)
{
  strcpy(name,TLname);
  colour = TLcolour;
}


void trafficLight::change_colour(int Tcolour)
{
  colour = Tcolour;
}
When I compile I get the below errors
$ make
g++ -g -c trafficJunction.cpp
trafficJunction.cpp: In method `void trafficJunction::carWantsToCross(char)':
trafficJunction.cpp:26: request for member `colour' in `trafficJunction::NS_boun
d', which is of non-aggregate type `trafficLight *'
trafficJunction.cpp:28: request for member `colour' in `trafficJunction::EW_boun
d', which is of non-aggregate type `trafficLight *'
trafficJunction.cpp: In method `void trafficJunction::change_to_green(char)':
trafficJunction.cpp:38: request for member `colour' in `trafficJunction::EW_boun
d', which is of non-aggregate type `trafficLight *'
trafficJunction.cpp:39: request for member `change_colour' in `trafficJunction::
NS_bound', which is of non-aggregate type `trafficLight *'
trafficJunction.cpp:40: request for member `change_colour' in `trafficJunction::
NS_bound', which is of non-aggregate type `trafficLight *'
trafficJunction.cpp:42: request for member `colour' in `trafficJunction::EW_boun
d', which is of non-aggregate type `trafficLight *'
trafficJunction.cpp:42: no matching function for call to `trafficJunction::chang
e_to_red (const char[3])'
trafficJunction.h:22: candidates are: void trafficJunction::change_to_red(char)
trafficJunction.cpp:43: request for member `change_colour' in `trafficJunction::
NS_bound', which is of non-aggregate type `trafficLight *'
trafficJunction.cpp:49: request for member `colour' in `trafficJunction::NS_boun
d', which is of non-aggregate type `trafficLight *'
trafficJunction.cpp:50: request for member `change_colour' in `trafficJunction::
EW_bound', which is of non-aggregate type `trafficLight *'
trafficJunction.cpp:51: request for member `change_colour' in `trafficJunction::
EW_bound', which is of non-aggregate type `trafficLight *'
trafficJunction.cpp:53: request for member `colour' in `trafficJunction::NS_boun
d', which is of non-aggregate type `trafficLight *'
trafficJunction.cpp:54: request for member `change_colour' in `trafficJunction::
EW_bound', which is of non-aggregate type `trafficLight *'
trafficJunction.cpp: In method `void trafficJunction::change_to_red(char)':
trafficJunction.cpp:66: request for member `colour' in `trafficJunction::NS_boun
d', which is of non-aggregate type `trafficLight *'
trafficJunction.cpp:67: request for member `colour' in `trafficJunction::NS_boun
d', which is of non-aggregate type `trafficLight *'
trafficJunction.cpp:71: request for member `colour' in `trafficJunction::NS_boun
d', which is of non-aggregate type `trafficLight *'
trafficJunction.cpp:72: request for member `change_colour' in `trafficJunction::
NS_bound', which is of non-aggregate type `trafficLight *'
trafficJunction.cpp:79: request for member `colour' in `trafficJunction::EW_boun
d', which is of non-aggregate type `trafficLight *'
trafficJunction.cpp:80: request for member `colour' in `trafficJunction::EW_boun
d', which is of non-aggregate type `trafficLight *'
trafficJunction.cpp:84: request for member `colour' in `trafficJunction::EW_boun
d', which is of non-aggregate type `trafficLight *'
trafficJunction.cpp:85: request for member `change_colour' in `trafficJunction::
EW_bound', which is of non-aggregate type `trafficLight *'
make: *** [trafficJunction.o] Error 1
   
Sorry that this post is long, but I'll be gratefull if you can help me. Thanx in advance [edited by - pars on November 6, 2003 5:32:50 PM] [edited by - pars on November 6, 2003 5:34:24 PM]

Share this post


Link to post
Share on other sites
When you are doing NS_bound and EW_bound.colour, you are trying to access a PRIVATE variable. You must either make this public, or make a function to return the value of colour.

Share this post


Link to post
Share on other sites
thanx for the response

I did make the modifications you suggessted (see below), but unfortunately there is no improvement:


#include <iostream>
using namespace std;


class trafficLight {
// private:



public:
char name[20];
int colour;
trafficLight(char TLname[], int TLcolour);
void change_colour(int Tcolour);
};

Share this post


Link to post
Share on other sites
You create a pointer to a trafficLight object like so:

trafficLight* NS_bound ;

Then you attempt to check the value of a member variable of the pointer.

NS_bound.colour == 1

You need to reference the pointer first, like so:

NS_bound->colour == 1

(or)

(*NS_bound).colour == 1

. is for structs or objects.

-> is for pointers to structs or objects

http://www.cplusplus.com/doc/tutorial/tut3-3.html

[edited by - Geoff the Medio on November 6, 2003 6:30:47 PM]

Share this post


Link to post
Share on other sites