2014-03-06 2 views
1

Я сделал приложение в C++, где пользователь записывает некоторые случайные числа (которые помещаются в массив) и отображаются ему, а с помощью конструктора копирования снова отображается его возраст ввода , Но проблема здесь в том, что функция копирования выполняется, но она не отображает никакой информации. Вот мой код:C++ Copy constructor runtime-error

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

class Identity{ 
protected: 
    int* arry_int; 
    int ages; 
    Identity(){} //private default constructor 
public: 
    Identity(int repeated_number){ //overloaded constructor 
     ages = repeated_number ; 
     arry_int = new int [ages]; 
    } 
    void getAge(){ //getting age form the user 
     for (int i = 0; i < ages; i++){ 
      cout << "Enter age[" << i << "]: "; 
      cin >> arry_int[i]; 
     } 
    } 
    void printAge(){ 
     cout << "Friend's ages" << endl; 
     cout << "-----------------" << endl; 
     for (int i = 0; i < ages; i++){ 
      cout << arry_int[i] << endl; 
     } 
    } 
    //move copy constructor 
    Identity(Identity&& cpy){ 
     cout << "Declaring move constructor" << endl; 
     arry_int = cpy.arry_int; 
     cpy.arry_int = NULL; 
    } 
    //move assignment operator 
    Identity& operator=(Identity&& cpy){ 
     cout << "Declaring move assignment operator" << endl; 
     if (this != &cpy){ 
     delete arry_int; 
     arry_int = cpy.arry_int; 
     cpy.arry_int = NULL; 
     } 
     return *this; 
    } 
    ~Identity(){ 
     delete arry_int; 
    } 
}; 

int main(){ 
    string nemesis; 
    Identity iden(5); 
    iden.getAge(); 
    iden.printAge(); 
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    cout << "Enter your nemesis name: " << endl; 
    getline(cin,nemesis); 
    //nemesis stealing your identit 
    Identity stolen(move(iden)); 
    cout << "Now " << nemesis << " stole your friend's age and used it against you" << endl; 
    stolen.printAge(); 
    system("pause"); 
    return 0; 
} 
+0

Конструкторы копирования и конструкторы перемещения различны. Не смешивайте условия; это просто путает всех остальных. – Brian

ответ

3

Вы забыли скопировать возраст участников данных в конструкторе двигаться.

Там должно быть

//move copy constructor 
Identity(Identity&& cpy){ 
    cout << "Declaring move constructor" << endl; 
    arry_int = cpy.arry_int; 
    cpy.arry_int = NULL; 
    ages = cpy.ages; 
} 

То же самое справедливо для оператора присваивания шаг

//move assignment operator 
Identity& operator=(Identity&& cpy){ 
    cout << "Declaring move assignment operator" << endl; 
    if (this != &cpy){ 
    delete arry_int; 
    arry_int = cpy.arry_int; 
    cpy.arry_int = NULL; 
    ages = cpy.ages; 
    } 
    return *this; 
} 

Также деструктор должен быть определен как

~Identity(){ 
     delete []arry_int; 
} 

И неизвестно, почему ты объявлен конструктор по умолчанию как защищенный.

+0

Спасибо @Vlad из Москвы, ваше объяснение отличное. И еще одна вещь, которую я хотел бы спросить. Зачем нам нужен конструктор перемещения, когда мы уже можем иметь конструктор копирования и иметь оператор присваивания копии? Спасибо – user3264250

+0

@ user3264250 В вашем классе нет ни конструктора копирования, ни оператора присваивания копии. Если говорить более точно, они определяются как удаленные. Если вы имеете в виду общий случай, то move constructor/assign позволяет избежать многочисленных операций с ресурсами, потому что они просто делегируются целевому объекту. –