2014-01-27 203 views
0

我是一个新的C++,我需要帮助我的程序。所以基本上它是一个可以创建角色的程序。我使用了构造函数,复制构造函数和解构器来创建它。现在有一个问题,每次我都会运行它时,它会给我一个错误,如复制 constructor.exe在0x0F424F98(msvcr110d.dll)这个C++帮助拷贝构造函数

未处理的异常:0000005:访问冲突读取位置 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; 
} 
+0

官方的复制构造函数只接受对其复制的对象的引用,而没有任何其他参数。如果你没有提供,编译器会为你生成一个。 –

回答

2

拷贝构造函数是为了使对象的副本。所以,拷贝构造函数原型为您将

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

那么该如何解决? – Jim

+0

用上面描述的替换您的拷贝构造函数的版本。有一件事我不明白的是为什么你使用指针/动态内存来创建对象成员。 – unxnut

+0

感谢队友也有一个问题,为什么复制构造函数只有一个参数?每个指针不应有一个参数 – Jim

1

吉姆,

什么,你在呼唤“拷贝构造函数”,因为编译器理解它是不是一个真正的拷贝构造函数。

拷贝构造函数的签名必须是:

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; 

如果你这样做,你并不需要一个明确的拷贝构造函数。编译器定义的拷贝构造函数将工作得很好。你也可以让编译器为你定义析构函数。

+0

但是使用后你不能释放空间(通过删除)吗? @R Sahu – Jim

+0

编译器定义的析构函数将释放“name”使用的空间,因为它将调用std :: string的析构函数。 –

0

这里是你的代码的外观使用对象而不是指针时等。

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

谢谢@R Sahu我也会记住你的程序,它确实节省了很多时间:)也像你说的那样,它会自动释放空间,但它能够防止内存泄漏的发生。 – Jim