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?

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

int swap_values(vector<int>numbers);

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

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



int swap_values(vector<int>numbers)
{
    
    numbers[3] = numbers[1];
    numbers[1] = numbers[2];
    numbers[2] = numbers[3];
    return 1;
}

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


/Simon

Comments
Welcome to Daniweb.

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.

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-lite/ctors.html#faq-10.3

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

class A
{
         int i;
         int j;
}

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

A::A(int int_i, int int_j )
{
      i = int_i; 
      j = int_j;
};

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,

A::A(int int_i, int int_j = 0)
{
      i = int_i; 
      j = int_j;
};

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.

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

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

like this.

class A
{
 ...
}

int some_function_that_takes_an_object_of_class_A( A a )
{ 
.....
}         
int main()
{
      A a;
      some_function_that_takes_an_object_of_class_A( a ); // sends a copy of a. the original a is not changed.
}

~sos~ has answered question 4.

Comments
Nice and detailed explantion-[Grunt]

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

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.

~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::Person(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!

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

~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::Person(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.

Thanks for the help! :)
But it still doesn't work properly.. It complains that the variable 'counter' is a private variable.. And it doesn't work if I cange it into a public one.
Any clues why?

EDIT: I've also got another question if someone knows the answer..
I'm working on an assignment where you have to take an object of a class and have it as an membervariable of another class. How do I do this?

Thanks for the help! :)
But it still doesn't work properly.. It complains that the variable 'counter' is a private variable.. And it doesn't work if I cange it into a public one.
Any clues why?

The answer to this is in the web link I gave you in my reply. Something about the static variable being initialized globally. See if you can find it.

EDIT: I've also got another question if someone knows the answer..
I'm working on an assignment where you have to take an object of a class and have it as an membervariable of another class. How do I do this?

class A
{
public:
      int a;
};

class B
{
public:
      A member_var_of_instance_A;
}
This article has been dead for over six months. Start a new discussion instead.