Note that there are some explanatory texts on larger screens.

plurals
  1. POCreating a function that is a friend to multiple classes
    primarykey
    data
    text
    <p>In the code below, I am trying to create a function "patient_count" that is a friend to the classes "horse" , "pig" , and "dog". I can get the function to be a friend with 1 class but not to all 3. Can anyone tell me what my mistake is? </p> <pre><code>/*******************************************************\ * Veternarian Class Problem - I need a class for each * * of 3 animals. Horse, Pig and Dogs * \*******************************************************/ #include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;string&gt; const int HORSE_KENNEL = 100; // Number of horses we can store const int PIG_KENNEL = 100; // Number of Pigs we can store const int DOG_KENNEL = 100; // Number of Dogs we can store /*******************************************************\ * Class horse * * * * Member functions * * horse_count -- Keeps track of the number of horses * * add_horse -- Sends data into the object * * next_horse -- returns data from the object * \*******************************************************/ // Definition of the Class class horse { private: int horse_count; // Variable to keep track of data std::string horse_data[HORSE_KENNEL]; // A Place to put the data // Declarations for the method Prototypes public: // Initialize horse( ); // A Function that accepts an argument but returns nothing void add_horse(const std::string new_horse_data); // This method returns the next Horse in the queue std::string next_horse( ); friend int patient_count(horse); }; /*******************************************************\ * Method Definition - Here we flush out the prototypes * * outlined in the last section * \*******************************************************/ inline horse::horse( ) { for(int i = 0; i &lt; HORSE_KENNEL; ++i){ horse_data[i] = "Empty Spot"; } horse_count = 0; // Zero the data count } /*******************************************************\ * horse::add_horse -- Send data to Object * \*******************************************************/ inline void horse::add_horse(const std::string new_horse_data) { horse_data[horse_count] = new_horse_data; ++horse_count; } /*******************************************************\ * horse::next_horse - get data from object * \*******************************************************/ inline std::string horse::next_horse( ) { // this is specifically implementing a queue std::string current_horse = " "; int target_horse = 0; for(int i = 0;i &lt; HORSE_KENNEL; ++i){ if(horse_data[i] != "Empty Spot"){ std::cout &lt;&lt; "Horse Number " &lt;&lt; i &lt;&lt; " " &lt;&lt; horse_data[i] &lt;&lt; std::endl; } } std::cout &lt;&lt; "Select the horse you want: "; std::cin &gt;&gt; target_horse; return (horse_data[target_horse]); } /*******************************************************\ * Class Pig * * * * Member functions * * pig_count -- Keeps track of the number of pigs * * add_pig -- Sends data into the object * * next_pig -- returns data from the object * \*******************************************************/ // Definition of the Class class pig { private: int pig_count; // Variable to keep track of data std::string pig_data[PIG_KENNEL]; // A Place to put the data // Declarations for the method Prototypes public: // Initialize pig( ); // A Function that accepts an argument but returns nothing void add_pig(const std::string new_pig_data); // This method returns the next pig in the queue std::string next_pig( ); friend pig patient_count(pig); }; /*******************************************************\ * Method Definition - Here we flush out the prototypes * * outlined in the last section * \*******************************************************/ inline pig::pig( ) { for(int i = 0; i &lt; PIG_KENNEL; ++i){ pig_data[i] = "Empty Spot"; } pig_count = 0; // Zero the data count } /*******************************************************\ * pig::add_pig -- Send data to Object * \*******************************************************/ inline void pig::add_pig(const std::string new_pig_data) { pig_data[pig_count] = new_pig_data; ++pig_count; } /*******************************************************\ * pig::next_pig - get data from object * \*******************************************************/ inline std::string pig::next_pig( ) { // this is specifically implementing a queue std::string current_pig = " "; int target_pig = 0; for(int i = 0;i &lt; PIG_KENNEL; ++i){ if(pig_data[i] != "Empty Spot"){ std::cout &lt;&lt; "pig Number " &lt;&lt; i &lt;&lt; " " &lt;&lt; pig_data[i] &lt;&lt; std::endl; } } std::cout &lt;&lt; "Select the pig you want: "; std::cin &gt;&gt; target_pig; return (pig_data[target_pig]); } /*******************************************************\ * Class dog * * * * Member functions * * dog_count -- Keeps track of the number of dogs * * data_to_object -- Sends data into the object * * data_from_object -- returns data from the object * \*******************************************************/ // Definition of the Class class dog { private: int dog_count; // Variable to keep track of data std::string dog_data[DOG_KENNEL]; // A Place to put the data // Declarations for the method Prototypes public: // Initialize dog( ); // A Function that accepts an argument but returns nothing void add_dog(const std::string new_dog_data); // This method returns the next dog in the queue std::string next_dog( ); friend dog patient_count(dog); }; /*******************************************************\ * Method Definition - Here we flush out the prototypes * * outlined in the last section * \*******************************************************/ inline dog::dog( ) { for(int i = 0; i &lt; DOG_KENNEL; ++i){ dog_data[i] = "Empty Spot"; } dog_count = 0; // Zero the data count } /*******************************************************\ * dog::add_dog -- Send data to Object * \*******************************************************/ inline void dog::add_dog(const std::string new_dog_data) { dog_data[dog_count] = new_dog_data; ++dog_count; } /*******************************************************\ * dog::next_dog - get data from object * \*******************************************************/ inline std::string dog::next_dog( ) { // this is specifically implementing a queue std::string current_dog = " "; int target_dog = 0; for(int i = 0;i &lt; DOG_KENNEL; ++i){ if(dog_data[i] != "Empty Spot"){ std::cout &lt;&lt; "dog Number " &lt;&lt; i &lt;&lt; " " &lt;&lt; dog_data[i] &lt;&lt; std::endl; } } std::cout &lt;&lt; "Select the dog you want: "; std::cin &gt;&gt; target_dog; return (dog_data[target_dog]); } /**************************************************\ * This function is a friend of all the animal * * classes and returns the total of all animals * * PROBLEM ******* PROBLEM *********PROBLEM ********* * When I add the other 2 classes on the next line * * The program stops working * \**************************************************/ // int patient_count(horse target_horse) //works int patient_count(horse target_horse, pig target_pig, dog target_dog) // Nova { // int all_animals = target_horse.horse_count; //Works int all_animals = target_horse.horse_count + target_pig.pig_count + target_dog.dog_count; // Nova return (all_animals); } /**************************************************\ * The Class is defined above, this section is a * * Small testing harness to verify that the class * * is doing what it was designed to do * \**************************************************/ int main( ) { int total_animals; horse current_horse; // Create a instance // Send 3 values to the object current_horse.add_horse("Mr Ed, 10, Male"); current_horse.add_horse("Lightning, 4, Female"); current_horse.add_horse("Blitz, 7, Male"); // Call for the return of the 3 values std::cout &lt;&lt; "Selected Horse -&gt;" &lt;&lt; current_horse.next_horse( ) &lt;&lt; '\n'; pig current_pig; // Create a instance // Send 3 values to the object current_pig.add_pig("Arnold, 4, Male"); current_pig.add_pig("Babe, 2, Female"); current_pig.add_pig("Killer, 7, Male"); // Call for the return of the 3 values std::cout &lt;&lt; "Selected Pig -&gt;" &lt;&lt; current_pig.next_pig( ) &lt;&lt; '\n'; dog current_dog; // Create a instance // Send 3 values to the object current_dog.add_dog("Misty, 15, Female"); current_dog.add_dog("Tristian, 12, Male"); current_dog.add_dog("Tempest, 11, Female"); // Call for the return of the 3 values std::cout &lt;&lt; "Selected Dog -&gt;" &lt;&lt; current_dog.next_dog( ) &lt;&lt; '\n'; // Now get the results from the friend function // total_animals = patient_count(current_horse); // Works total_animals = patient_count(current_horse, current_pig, current_dog); // Nova std::cout &lt;&lt; "Total Animals: " &lt;&lt; total_animals &lt;&lt; std::endl; return (0); } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload