C 帮助复制构造函数

C++ help copy constructor

本文关键字:构造函数 复制 帮助      更新时间:2023-10-16

我是C 的新手,我需要帮助我的程序。因此,基本上,这是一个可以创建角色的程序。我已经使用构造函数,复制构建器和解构器来创建它。现在有一个问题,每次我运行它时,都会给我一个错误,例如此

copy中的0x0f424f98(msvcr110d.dll)的未经处理的异常 constructor.exe:0xc0000005:访问违规的阅读位置 0xfeeefee2

无论如何,这是我的代码,如果您要看一下,它会很感激

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

复制构造函数旨在制作对象的副本。因此,您的复制构造函数原型将为

Character ( const Character& c );

您声明的一个具有Character类型的三个不同参数。完整的构造函数将是:

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

jim,

您所说的"复制构造函数"并不是编译器所理解的副本构造函数。

复制构造函数的签名必须为:

Character(Character const& copy);

实现将类似于您定义复制构造函数的方式。

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

您可以通过略有不同的方式来使事情变得更简单。而不是

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

您可以使用

string name;
int age;
char gender; 

如果这样做,则不需要明确的复制构造函数。编译器定义的复制构造函数将正常工作。您也可以让编译器为您定义毁灭者。

这是使用对象而不是指针时的代码。

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