2015-11-17 3 views
0

Я бы не стал просить об этом, но примерно через 5 часов работы в поисковых системах и копировании через стек, текстовые книги и видеоролики YouTube я все еще застрял. Вот код, с которым я работаю (да, это довольно плохо, я просто изучаю C++). Если вы дойдете до сути, вы увидите, что мне не удается заставить конструктор копирования фактически создать другой объект типа SimpleVector. В последней строке показано, где я пытаюсь использовать созданный мной конструктор копирования, чтобы сделать mySV2 из mySV, а затем продемонстрировать, что это произошло с помощью функции печати для нового объекта.C++ Как правильно использовать конструкторы копирования с шаблонами классов

Еще раз спасибо за помощь и с моим новым вопросом. Я искренне верю, что обратная связь - это завтрак чемпионов (и меньше дерьмовых кодеров), поэтому, пожалуйста, уберите их и узнайте, что я буду вечно благодарен (или, по крайней мере, на протяжении всего этого класса) за вашу помощь.

template <class T> 
class SimpleVector { 
public: 
    T* myarray; 
    T* temparr; 
    //constructors 
    SimpleVector() { 
     size = 0; 
     myarray = NULL; 
    } 

    SimpleVector(int sz) { 
     size = sz; 
     myarray = new T[size]; 
    } 

    //**** Copy Constructor **** 
    SimpleVector(const SimpleVector& sv) { 
     size = sv.size; 
     dataType = sv.dataType; 
     temparr = new T[size]; 
     for (int i = 0; i < size; i++) { 
      temparr[i] = sv.myarray[i]; 
     } 
     myarray = temparr; 
    } 

}; 

int main() { 
     int howMany = 5; 
     SimpleVector<string> mySV(howMany); 
     for (int i = 0; i < howMany; i++) { 
      cout << "Enter item " << (i + 1) << ": "; 
      cin >> mySV.myarray[i]; 
     } 
    mySV.print(); 

    template<class T> 
    SimpleVector<T> mySV2(mySV); 

    mySV2.print(); 

    return 0; 
} 
+2

Существует много нерелевантного кода, можете ли вы попытаться создать [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve) и показать нам вместо этого? –

+1

Конструктор копирования - это единственное, что не является проблемой в этом. Вы пытаетесь использовать объекты за пределами их области действия, и вы пытаетесь объявить переменную шаблона внутри main. И у вас нет соответствующих открытых и закрытых брекетов. –

+0

Спасибо за отзыв. Я попытался очистить его, чтобы было легче пройти. Если бы я не поместил определение класса шаблона обратно в основное, казалось бы, попытка использовать конструктор копирования просто породила ошибку неопределенного типа. Добавление его там разрешило это, но создало больше проблем. Спасибо вам за помощь. Надеюсь, я разрежу его, чтобы облегчить прохождение. –

ответ

1

С кодом возникает несколько проблем. Строка temparr = new T[size]; создает утечку памяти, так как temparr не удаляется в деструкторе. temparr на самом деле не является необходимым для конструктора копирования:

SimpleVector(const SimpleVector& sv){ 
    size = sv.size; 
    dataType = sv.dataType; 
    myarray = new T[size]; 
    for (int i = 0; i < size; i++) { 
     myarray[i] = sv.myarray[i]; 
    } 
} 

При копировании указателей основных типов Я хотел бы также предложить, используя функцию std::copy из заголовка <utility>. Вы также должны рассмотреть the rule of three при работе с конструкторами копирования.

Следующая проблема находится в главном:

template<class T> 
SimpleVector<T> mySV2(mySV); 

Здесь нужно указать тип T для построения объекта. Ваш член класса dataType не может указать тип вашего вновь созданного объекта. Вы должны изменить его

SimpleVector<std::string> mySV2(mySV); 

После добавления void print() функции членов и членов size_t size и std::string dataType код который выполняется правильно.

+1

Конец вашего конструктора копий теряет старый массив и удаляет новый, который затем указывает на «myarray». –

+0

@SebastianRedl Да, очевидно. Я исправил ошибку в моем примере кода. Я не заметил, как код все еще выполняется правильно. Должно было идти с 'std :: copy' все время. Спасибо за хедз-ап. –

Смежные вопросы