Pregunta

I am a new at c++ and I need help with my program. So basically it is a program where you can create a character. I have used constructor, copy-constructor, and deconstructor to create it. Now there is a problem, every time I would run it, it would give me an error such as this

Unhandled exception at 0x0F424F98 (msvcr110d.dll) in Copy constructor.exe: 0xC0000005: Access violation reading location 0xFEEEFEE2

anyway here is my code and would appreciate it if you would take a look at it

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

class Character {
private:
    string* name;
    int* age;
    char* gender;
public:
    //declaring constructor
    Character(const string pname, const int page, const char pgender) {
        cout << "Making new character" << endl;
        name = new string;
        age = new int;
        gender = new char;
        //assingment operator
        *name = pname;
        *age = page;
        *gender = pgender;
    }
    //declaring copy constructor
    Character(const Character& cName, const Character& cAge, const Character cGender) {
        cout << "Keeping a copy constructor" << endl;
        name = new string;
        age = new int;
        gender = new char;
        //assingment operator
        *name = *cName.name;
        *age = *cAge.age;
        *gender = *cGender.gender;
    }
    ~Character() {
        cout << "Deleting the character " << endl;
        delete name;
        delete age;
        delete gender;
    }
    //get name
    string getName() {
        return *name;
    }
    //get age
    int getAge() {
        return *age;
    }
    //get gender
    char getGender() {
        return *gender;
    }
};
void showCharacter(Character display) {
    cout << "Charater Name: " << display.getName() << endl; //get name
    cout << "Character Age: " << display.getAge() << endl; //get age
    cout << "Character Gender: " << display.getGender() << endl; //get gender 
}

int main() {
    //local variables
    string name;
    int age;
    char gender;
    //user interface
    cout << "Write your charaters name: ";
    cin >> name;
    cout << "Write your character's age: ";
    cin >> age;
    cout << "Write you character's gender: ";
    cin >> gender;
    //calling constructor
    Character detail(name,age,gender);
    //Showing result
    showCharacter(detail);
    system("pause");
    return 0;
} 
¿Fue útil?

Solución

The copy constructor is meant to make a copy of the object. So, the copy constructor prototype for you will be

Character ( const Character& c );

The one you have declared has three different parameters of type Character. The complete constructor will be:

Character(const Character& cName){
    cout << "Keeping a copy constructor" << endl;
    name = new string;
    age = new int;
    gender = new char;
    //assingment operator
    *name = *(cName.name);
    *age = *(cName.age);
    *gender = *(cName.gender);
    }

Otros consejos

Jim,

What you are calling "Copy Constructor" is not really a copy constructor as the compiler understands it.

The signature of the copy constructor has to be:

Character(Character const& copy);

The implementation would be similar to the way you have defined your copy constructor.

Character(const Character& copy){
cout << "Keeping a copy constructor" << endl;
name = new string;
age = new int;
gender = new char;
//assingment operator
*name = *copy.name;
*age = *copy.age;
*gender = *copy.gender;
}

You can make things a whole lot simpler by declaring the data slightly differently. Instead of

string* name;
int* age;
char* gender;

You can use

string name;
int age;
char gender; 

If you do that, you don't need an explicit copy constructor. The compiler defined copy constructor will work just fine. You can also let the compiler define the destructor for you.

Here's what your code will look like when using objects instead of pointers.

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

class Character {
  private:
    string name;
    int age;
    char gender;
  public:
    //declaring constructor
    Character(const string pname, const int page, const char pgender):
       name(pname), age(page), gender(pgender) {
         cout << "Making new character" << endl;
    }

    // NO need for explicit copy constructor or destructor.

    //get name
    string getName() {
        return name;
    }
    //get age
    int getAge() {
        return age;
    }
    //get gender
    char getGender() {
        return gender;
    }
};
void showCharacter(Character display) {
    cout << "Charater Name: " << display.getName() << endl; //get name
    cout << "Character Age: " << display.getAge() << endl; //get age
    cout << "Character Gender: " << display.getGender() << endl; //get gender 
}

int main() {
    //local variables
    string name;
    int age;
    char gender;
    //user interface
    cout << "Write your charaters name: ";
    cin >> name;
    cout << "Write your character's age: ";
    cin >> age;
    cout << "Write you character's gender: ";
    cin >> gender;
    //calling constructor
    Character detail(name,age,gender);
    //Showing result
    showCharacter(detail);
    system("pause");
    return 0;
} 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top