2014-08-03 2 views
0

Я пытаюсь сделать простую вещь, но внезапно застрял между ними. Здесь, в моем коде, я пытаюсь вызвать конструктор, в котором я бы только передавал длину, мой первый конструктор инициализирует массив size = length всеми элементами 0.второй конструктор, вызванный в C++ (неправильный вывод)

Затем я передаю массив конструктору в дать ранее определенному массиву его значение

здесь образец:

class myvector 
{ 
    int *arr; 
    int length; 

public : 
    myvector(int); 
    myvector(int *); 

}; 

myvector :: myvector (int len) 
{ 
    arr = new int [length = len]; 
    for (int i=0;i< length;i++) 
    { 
     arr[i] = 0; 
    } 

} 

myvector :: myvector (int *ex) 
{ 
    for (int i=0;i< length;i++) 
    { 

     cout << ex[i] << " " << length <<" "; 
     arr[i] = ex[i]; 
     cout << arr[i]<< " "; 

    } 
} 

int main() 
{ 

    myvector v1(5); 
    int x[5] = {2,3,4,45,6}; 
    v1 = x; 

} 

Вот в мою второй длине конструкторы, который был определен в первом constrcutor потерял свои ценности, а также массив обры теряют свои значения

Я что-то сделал? Просьба уточнить меня по этому вопросу

+0

Прежде всего, вы никогда не выделять какой-либо памяти для '' arr' в ст 'array умирает сразу после окончания области конструкторов, вы будете иметь неопределенное поведение ... (то же самое касается второго конструктора, который просто пишет в нераспределенную память) – Scis

+0

Почему бы просто не использовать [std :: vector] (http://www.cplusplus.com/reference/vector/vector/)? – user1810087

+0

@Scis, я отредактировал, чтобы дать память, но все равно такая же ошибка, даже длина теряет значение. – Ke7in

ответ

4

Не думаю, что вы вполне поняли обстоятельства, в которых задействованы конструкторы. Строка v1 = x не помещает значения в память, выделенную во время первого вызова конструктора. Скорее, он создает новыйmyvector (с использованием второго конструктора) и копирует его в v1. Материал, который вы делаете во время первого вызова конструктора, теряется.

Похоже, вы хотите определить оператор присваивания, а не конструктор, принимающий аргумент int*. Кроме того, в общем случае вы должны объявлять конструкторы с одним аргументом как explicit, чтобы предотвратить случайное событие такого рода.

+0

Спасибо за ответ sneftel – Ke7in

2

Прежде всего, при указании размера массива, подобного этому, вы должны указать постоянное значение. См. here. И я действительно рекомендую вам использовать std :: vector <> для таких задач.

Но в любом случае, как упоминалось в Sneftel, кажется, что вы хотите определить оператор присваивания (см. here для получения дополнительной информации о перегрузке операторов в таких задачах, как ваша).

Вот как я реализовал его (НЕ и идеальное решение, но это работает, и дает основную идею):

#include <iostream> 

using namespace std; 

class myvector 
{ 
    int *arr; 
    int length; 

public : 
    //I completely removed second constructor 
    myvector(int); 
    ~myvector(); 

    void operator=(const int* otherArray); 
    void printArray(); 
}; 

myvector::myvector (int len) 
{ 
    length = len; 

    arr = new int[length]; // This is the way, how you can handle a non constant array sizes 

    for (int i=0;i< length;i++) 
    { 
     arr[i] = 0; 
    } 
} 

void myvector::printArray() 
{ 
    for(unsigned i = 0; i < length; ++i) 
     cout<<"arr["<<i<<"] = "<<arr[i]<<endl; 
} 

//Here's an overloaded '=' operator. 
//int x[5] = {2,3,4,45,6}; 
//myvector v; 
//v = x; - here this function is called 
void myvector::operator=(const int* otherArray) 
{ 
    for(unsigned i = 0; i < length; ++i) 
     arr[i] = otherArray[i]; 
} 

myvector::~myvector() 
{ 
    delete []arr; // You should ALWAYS delete what you allocated with new 
} 

int main() 
{ 
    myvector v1(5); 
    int x[5] = {2,3,4,45,6}; 

    v1 = x; 

    v1.printArray(); 
} 
Смежные вопросы