943,670 Members | Top Members by Rank

Ad:
  • C++ Discussion Thread
  • Unsolved
  • Views: 2386
  • C++ RSS
You are currently viewing page 1 of this multi-page discussion thread
Sep 4th, 2006
1

A few questions on classes!..

Expand Post »
Hello!
I just recently registred at this forum and I must say it seems to be a nice and friendly place!
I'm currently studying a beginners course in C++ and I'm a bit stuck right now.. So I thought perhaps it might be a good idea to ask soem questions here and see if any of you guys could help me out!

My problems are the following..

1. I'm making a program with a default constructor and an overloaded constructor. They're both called by different rules and produces a testline of text when called. The assignment is to give the overloaded constructor default arguments to see what happens. I wonder, what is a default argument i an overloaded constructor?

2. How do you instance an object from a class in different scope?

3. How do you send an object "by value" to a function?

4. Here's a "Non class" question.
How do you make a function which swaps the values of two indexes on a vector (like swaps numbers[1] with numbers[2])?
I've tried to make this but it only works when showing the results of the swap in the function, not when I show the results in the main function. When doing that it remains unchanged.
Here's the code I've used. What am I doing wrong?

C++ Syntax (Toggle Plain Text)
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. int swap_values(vector<int>numbers);
  6.  
  7. int main ()
  8. {
  9. vector<int>numbers(3);
  10. cout << "Let's swap vector values\n";
  11. cout << "Enter value 1 " << endl;
  12. cin >> numbers[1];
  13. cout << "Enter value 2 " << endl;
  14. cin >> numbers[2];
  15.  
  16. cout << "vector 1: " << numbers[1] << endl;
  17. cout << "vector 2: " << numbers[2] << endl;
  18. cout << "vector 3: " << numbers[3] << endl;
  19. swap_values(numbers);
  20. cout << "vector 1: " << numbers[1] << endl;
  21. cout << "vector 2: " << numbers[2] << endl;
  22. cout << "vector 3: " << numbers[3] << endl;
  23. cin.get();
  24. cin.get();
  25. return 0;
  26. }
  27.  
  28.  
  29.  
  30. int swap_values(vector<int>numbers)
  31. {
  32.  
  33. numbers[3] = numbers[1];
  34. numbers[1] = numbers[2];
  35. numbers[2] = numbers[3];
  36. return 1;
  37. }

Thanks a lot for helping me! It means a lot! :cheesy:


/Simon
Last edited by WolfPack; Sep 4th, 2006 at 4:51 pm. Reason: Removed the link and embedded the code in to the post.
Similar Threads
Reputation Points: 16
Solved Threads: 0
Newbie Poster
Natrius is offline Offline
4 posts
since Sep 2006
Sep 4th, 2006
1

Re: A few questions on classes!..

1. I'm making a program with a default constructor and an overloaded constructor. They're both called by different rules and produces a testline of text when called. The assignment is to give the overloaded constructor default arguments to see what happens. I wonder, what is a default argument i an overloaded constructor?

ans: i am sorry but i dont understand what are u trying to convey here. Post the same question with some examples on how you are going to implement it.

2. How do you instance an object from a class in different scope?

ans: Just create the object a normal way but just keep in mind that that instance of the object will only be valid for that same scope and not beyond it.

3. How do you send an object "by value" to a function?

ans: Objects and variables are by default sent by value. To send the object by reference you can do pass by reference using the C++ reference mechanism or the old C style pointer mechanism.

4. How do you make a function which swaps the values of two indexes on a vector (like swaps numbers[1] with numbers[2])?

ans: The ans to this lies in the prev question. To make function reflect teh changes done to the variables beyond the function scope you need to pass the variable using the pass by reference mechanism.

I would very much recommend you to get all your objected oriented and C++ basic concepts cleared before attempting something like vectors.

Here is ur updated code which i think will work now. Just look out for the changes i have made.

#include <iostream>
#include <vector>
using namespace std;

bool swap_values(vector<int>& numbers);

int main ()
{
     vector<int> numbers(2);
    cout << "Let's swap vector values\n";
    cout << "Enter value 1 " << endl;
    cin >> numbers[0];
    cout << "Enter value 2 " << endl;
    cin >> numbers[1];

   // indexing starts at 0 and not 1 so the first element is indexed by
  // numbers [0] and not numbers [1].
 
    cout << "vector 1: " << numbers[0] << endl;
    cout << "vector 2: " << numbers[1] << endl;
  
    swap_values(numbers);

    cout << "vector 1: " << numbers[0] << endl;
    cout << "vector 2: " << numbers[1] << endl;
  
   cin.get(); cin.get();

    return 0;
}

// btw what type of swap were u planning to implement using three values ???
// i thought u would want  a swap with 2 values and changed the program likewise.

bool swap_values(vector<int>& numbers)
{

// better make the function return bool instead of the old style "int"

    int temp = numbers[1] ;
    numbers[1] = numbers[0];
    numbers[0] = numbers[1];
    return true;
}

Hope it helped, bye.
Last edited by ~s.o.s~; Sep 4th, 2006 at 5:23 pm.
Super Moderator
Featured Poster
Reputation Points: 3233
Solved Threads: 719
Failure as a human
~s.o.s~ is offline Offline
8,871 posts
since Jun 2006
Sep 4th, 2006
1

Re: A few questions on classes!..

Click to Expand / Collapse  Quote originally posted by Natrius ...
1. I'm making a program with a default constructor and an overloaded constructor. They're both called by different rules and produces a testline of text when called. The assignment is to give the overloaded constructor default arguments to see what happens. I wonder, what is a default argument i an overloaded constructor?
I believe that's this kinda thing.
#include <iostream>

class T
{
   int a,b,c; // private data
public:
   T(int a_ = 0, int b_ = 0, int c_ = 0) : a(a_), b(b_), c(c_)
   {
      std::cout << "default constructor with default arguments:\n";
      std::cout << "a = " << a << ',';
      std::cout << "b = " << b << ',';
      std::cout << "c = " << c << '\n';
   }
};

int main(int argc, char *argv[])
{
   T t(1), u(1,2,3);
   return 0;
}

/* my output
default constructor with default arguments:
a = 1,b = 0,c = 0
default constructor with default arguments:
a = 1,b = 2,c = 3
*/
[edit]http://www.parashift.com/c++-faq-lit....html#faq-10.3
Last edited by Dave Sinkula; Sep 4th, 2006 at 5:38 pm.
Team Colleague
Reputation Points: 2780
Solved Threads: 312
long time no c
Dave Sinkula is offline Offline
4,790 posts
since Apr 2004
Sep 4th, 2006
1

Re: A few questions on classes!..

Click to Expand / Collapse  Quote originally posted by Natrius ...
1. I'm making a program with a default constructor and an overloaded constructor. They're both called by different rules and produces a testline of text when called. The assignment is to give the overloaded constructor default arguments to see what happens. I wonder, what is a default argument i an overloaded constructor?
Lets take class A such that
C++ Syntax (Toggle Plain Text)
  1. class A
  2. {
  3. int i;
  4. int j;
  5. }
A default constructor is a constructor that doesn't take any arguments.
e.g. A::A();
An overloaded constructor is a constructor that takes arguments.
e.g
C++ Syntax (Toggle Plain Text)
  1. A::A(int int_i, int int_j )
  2. {
  3. i = int_i;
  4. j = int_j;
  5. };
you can use the values of int_i and int_j to assign values for class A's member variables i and j.
If you write the overloaded constructor like this,
C++ Syntax (Toggle Plain Text)
  1. A::A(int int_i, int int_j = 0)
  2. {
  3. i = int_i;
  4. j = int_j;
  5. };
calling the constructor like A a(2), will create an object a with a.i = 2 and a.j = 0;
calling the constructor like A a(2,9), will create an object a with a.i = 2 and a.j = 9;
If you have a default constructor defined, don't make all the arguments of the overloaded constructor default arguments. That is because the compiler will not be able to tell the difference between the two constructors.

Click to Expand / Collapse  Quote originally posted by Natrius ...
2. How do you instance an object from a class in different scope?
I think you are asking about something like this.
Class B is defined in Class A.So B is defined inside the scope of A. To create an instance of B, you should do something like this.
#include <iostream>

class A
{
public:
    class B
    {
    public:
        int i;
    };
};

int main()
{
    A::B b;
    b.i = 9;
    std::cout << b.i << std::endl;
}
Click to Expand / Collapse  Quote originally posted by Natrius ...
3. How do you send an object "by value" to a function?
like this.
C++ Syntax (Toggle Plain Text)
  1. class A
  2. {
  3. ...
  4. }
  5.  
  6. int some_function_that_takes_an_object_of_class_A( A a )
  7. {
  8. .....
  9. }
  10. int main()
  11. {
  12. A a;
  13. some_function_that_takes_an_object_of_class_A( a ); // sends a copy of a. the original a is not changed.
  14. }

~sos~ has answered question 4.
Last edited by WolfPack; Sep 4th, 2006 at 5:41 pm.
Moderator
Reputation Points: 572
Solved Threads: 115
Mentally Challenged Mod.
WolfPack is offline Offline
1,559 posts
since Jun 2005
Sep 5th, 2006
0

Re: A few questions on classes!..

First of all I'd like to say thanks for all your help! It's been really helpful! :cheesy:

Now I wonder another thing.. I'm making a program and I'm just testing different stuff.. What I want is to add a classvariable that counts the number of instances and that is used by the constructor.. I've made it like the following but only gets a strange number like 2923920 as a result.. What am I doing wrong?
Thanks again for helping a total newbie out!

I highlighted the code for the counter in blue.

Code:

#include <iostream>
using namespace std;
class Person
{
      public:
 
             string first_name;
             string last_name;
             string month;
             int year;
             int day;
 
 
             Person();
             Person(string first_name, string last_name);
             ~Person();
             void getinfo();
             void setinfo();
             void deleter();
             void count_instance();
 
             private:
             int *pointer; 
             int counter;
};
int main ()
{
Person enter;
Person pass;
Person testing();
int *pointer; 
pointer = new int;
enter.setinfo();
cout << "Test: The pointer is: " << *pointer << endl;
enter.getinfo();
enter.deleter();
cout << "Test: The pointer is: " << *pointer << endl; 
enter = Person(enter.first_name, enter.last_name);
 
 cin.get();
 cin.get();
 
 enter.count_instance();
 
  cin.get();
 cin.get();
    return 0;
}
void Person::setinfo()
{
    counter = 0;
    cout << "counter is: " << counter;
    cout << "Name1?" << endl;
    cin >> first_name;
    cout << endl << "Name2?" << endl;
    cin >> last_name;
    cout << endl << "Year?" << endl;
    cin >> year;
    cout << endl << "Month?" << endl;
    cin >> month;
    cout << endl << "Day?" << endl;
    cin >> day;
    }
 
    void Person::getinfo()
{
    cout << first_name << " " << last_name << " " << year << " " << month << " " << day;
    }
 
    void Person::count_instance()
    {
         cout << "counter is: " << counter; 
         }
 
void Person::deleter()
 {
                       delete [] pointer;
}
 
 Person::Person()
 {
                 counter = counter +1;
                 cout << "Def Constructor!" << endl;
                  }
 
 Person::Person(string first_name, string last_name)
 {
                  counter = counter +1;
                  cout << "Overloaded Constructor!" << endl; 
                  }
 
 
Person::~Person()
 {
                       cout << "DESTRUCTOR!" << endl;
}
Last edited by Natrius; Sep 5th, 2006 at 4:21 pm.
Reputation Points: 16
Solved Threads: 0
Newbie Poster
Natrius is offline Offline
4 posts
since Sep 2006
Sep 5th, 2006
0

Re: A few questions on classes!..

Read the part called static members.
Moderator
Reputation Points: 572
Solved Threads: 115
Mentally Challenged Mod.
WolfPack is offline Offline
1,559 posts
since Jun 2005
Sep 5th, 2006
0

Re: A few questions on classes!..

The classic and the best way to keep track of the instances created is using the static int counter; member variable in your class. The speciality of "static" variable is that for any number of instances of the class created they all have a common copy of the instance variable. So any changes made to the instance variable using one object will be refleceted when the variable is accessed using the next object.

Maybe something like

#include <iostream>
using namespace std;
class Person
{
      public:
 
             string first_name;
             string last_name;
             string month;
             int year;
             int day;
 
 
             Person();
             Person(string first_name, string last_name);
             ~Person();
             void getinfo();
             void setinfo();
             void deleter();
             void count_instance();

             static int getCount ( ); 
             static void incrCount ( ); 
 
      private:
             int *pointer; 
             static int counter;
};
int main ()
{
Person enter;
Person pass;
Person testing();
int *pointer; 
pointer = new int;
enter.setinfo();
cout << "Test: The pointer is: " << *pointer << endl;
enter.getinfo();
enter.deleter();
cout << "Test: The pointer is: " << *pointer << endl; 
enter = Person(enter.first_name, enter.last_name);
 
cout << "\nThe object count is" << Person::getCount(); // call to static function of class
 
 cin.get();
 return 0;
}


void Person::setinfo()
{
    counter = 0;
    cout << "counter is: " << counter;
    cout << "Name1?" << endl;
    cin >> first_name;
    cout << endl << "Name2?" << endl;
    cin >> last_name;
    cout << endl << "Year?" << endl;
    cin >> year;
    cout << endl << "Month?" << endl;
    cin >> month;
    cout << endl << "Day?" << endl;
    cin >> day;
    }
 
    void Person::getinfo()
{
    cout << first_name << " " << last_name << " " << year << " " << month << " " << day;
    }
 
    void Person::count_instance()
    {
         cout << "counter is: " << counter; 
         }
 
void Person::deleter()
 {
                       delete [] pointer;
}
 
 Person::Person()
 {
                 Person::incrCount ( );
                 cout << "Def Constructor!" << endl;
                  }
 
 Person::Person(string first_name, string last_name)
 {
                  Person::inctCount ( );
                  cout << "Overloaded Constructor!" << endl; 
                  }
 
 
Person::~Person()
 {
                       cout << "DESTRUCTOR!" << endl;
}

 static void incrCount ( )
{ 
  Person::count ++ ;
}

static int getCount ( )
{
 return Person::count ;
}
HOpe it helped, bye.
Last edited by ~s.o.s~; Sep 5th, 2006 at 4:48 pm.
Super Moderator
Featured Poster
Reputation Points: 3233
Solved Threads: 719
Failure as a human
~s.o.s~ is offline Offline
8,871 posts
since Jun 2006
Sep 6th, 2006
0

Re: A few questions on classes!..

~s.o.s~ --> I tried running your modified program, but I got some errors when running it in Bloodshed Dev-C++.
This is what the log says:

In constructor `Person:erson(std::string, std::string)':
Line 89 `inctCount' is not a member of `Person'
In function `void incrCount()':
Line 101 `count' is not a member of `Person'
In function `int getCount()':
Line 106 `count' is not a member of `Person'

Any idea why it does this?

Thanks!
Reputation Points: 16
Solved Threads: 0
Newbie Poster
Natrius is offline Offline
4 posts
since Sep 2006
Sep 6th, 2006
0

Re: A few questions on classes!..

There is a spelling mistake in the constructor.
Change this
Person::Person(string first_name, string last_name)
{
Person::inctCount ( );
cout << "Overloaded Constructor!" << endl; 
}
to this.
Person::Person(string first_name, string last_name)
{
Person::incrCount ( );
cout << "Overloaded Constructor!" << endl; 
}
Change these also
 static void incrCount ( )
{ 
  Person::counter ++ ;
}

static int getCount ( )
{
 return Person::counter ;
}
Last edited by WolfPack; Sep 6th, 2006 at 10:07 pm.
Moderator
Reputation Points: 572
Solved Threads: 115
Mentally Challenged Mod.
WolfPack is offline Offline
1,559 posts
since Jun 2005
Sep 7th, 2006
0

Re: A few questions on classes!..

Click to Expand / Collapse  Quote originally posted by Natrius ...
~s.o.s~ --> I tried running your modified program, but I got some errors when running it in Bloodshed Dev-C++.
This is what the log says:

In constructor `Person:erson(std::string, std::string)':
Line 89 `inctCount' is not a member of `Person'
In function `void incrCount()':
Line 101 `count' is not a member of `Person'
In function `int getCount()':
Line 106 `count' is not a member of `Person'

Any idea why it does this?

Thanks!
Oh i am very sorry, it was a spelling mistake on my part.

Anyways as you can see Mod. Wolfpack has already corrected the mistake for me (thanks to him for that).

If any problem persists, dont hesitate to post again.
Super Moderator
Featured Poster
Reputation Points: 3233
Solved Threads: 719
Failure as a human
~s.o.s~ is offline Offline
8,871 posts
since Jun 2006

This thread is more than three months old

No one has posted to this discussion for at least three months. Please let old threads die and do not reply to them unless you feel you have something new and valuable to contribute that absolutely must be added to make the discussion complete. Otherwise, please start a new thread in this forum instead.
Message:
Previous Thread in C++ Forum Timeline: Need help: how to use the scope operator :: here ?
Next Thread in C++ Forum Timeline: Conversion Constructor and overloaded operator= help





About Us | Contact Us | Advertise | Acceptable Use Policy
Forum Index | Build Custom RSS Feed


Follow us on Twitter


© 2011 DaniWeb® LLC