В моем классе comp sci мы создаем векторный класс. Я застрял, потому что мой конструктор копирования инициализирует мою «предельную» переменную значением мусора, и я не понимаю, почему.
Вот мой основной:
myStringVector v1 {"a", "b", "c"};
std::cout << "make it here?" << std::endl;
myStringVector v2 = v1;
std::cout << v1[0] << v1[1] << v1[2] << std::endl;
std::cout << v2[0] << v2[1] << v2[2] << std::endl;
assert(v1 == v2);
std::cout << "Passed copy ctor" << std::endl;
Вот конструктор, который принимает initializer_list
myStringVector::myStringVector(std::initializer_list<myString> list){
this->reserve(list.size());
for(int i = 0; i < limit-1; i++){
construct(first+i, list.begin()[i]);
}
}
Вот конструктор копирования
myStringVector::myStringVector(const myStringVector& data){
reserve((data.limit)-1);
for(int i = 0; i < data.limit-1; i++){
construct(&first+i, data.first+i);
}
}
Вот как выглядит резерв
void myStringVector::reserve(int n){
this->first = allocate<myString>(n);
this->last = first+n;
this->limit = n+1;
}
Мое утверждение в main терпит неудачу, потому что я перегрузил оператор ==, чтобы сначала проверить, равны ли ограничения. Если это не так, функция возвращает false. После этого функция продолжается, но это утверждение не выполняется, потому что я получаю для моего v1 значение 4, что правильно, а затем мой v2 - это какое-то большое число, которое не имеет смысла.
Я попытался переписать свой конструктор копирования, чтобы напрямую инициализировать члены класса без использования резерва, но он по-прежнему не работает. Он все еще ограничивает значения мусора. В остальном работает нормально.
Вот что выводит main ...
сделать это здесь?
abc
abc
4 7500072
Ошибка утверждения: v1 == v2, файл myCodeTres.cpp, строка 58
Я чувствую, что перепробовал все, что мог, чтобы исправить это, но ничего не работает. Что-нибудь посоветуете мне?
Спасибо.
Обновление: это ошибка компилятора, которую я получаю, когда оставляю амперсанд.
В файле, включенном из myCodeTres.cpp: 20: myMemory.hpp: В экземпляре конструкции 'T * (T *, Args && ...) [с T = myString; Args = {myString *}] ': myStringVector.cpp: 25: 36: требуется отсюда myMemory.hpp: 61: 10: ошибка: нет соответствующей функции для вызова' myString :: myString (myString *) '61 | вернуть новый (p) T (std :: forward (args) ...); | ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
** тогда есть какие-то странные ошибки, которые отображаются синим цветом на экране компилятора **
В файле, включенном из myCodeTres.cpp: 23: myString.cpp: 42: 1: примечание: кандидат: 'myString :: myString (myString &&)' 42 | myString :: myString (myString && move): strLength (strlen (move.stringVar)) // перемещаем конструктор для перемещения содержимого из | ^ ~~~~~~~ myString.cpp: 42: 31: примечание: неизвестное преобразование аргумента 1 из myString * в myString && '42 | myString :: myString (myString && move): strLength (strlen (move.stringVar)) // перемещаем конструктор для перемещения содержимого из | ~~~~~~~~~~~ ^ ~~~ myString.cpp: 32: 1: примечание: кандидат: 'myString :: myString (const myString &)' 32 | myString :: myString (const myString & strToCpy): strLength (strlen (strToCpy.stringVar)) // конструктор копирования, удаляющий старые элементы | ^ ~~~~~~~ myString.cpp: 32: 36: примечание: неизвестное преобразование аргумента 1 из myString * в const myString & '32 | myString :: myString (const myString & strToCpy): strLength (strlen (strToCpy.stringVar)) // конструктор копирования, удаляющий старые элементы | ~~~~~~~~~~~~~~~~ ^ ~~~~~~~ В файле, включенном из myCodeTres.cpp: 23: myString.cpp: 23: 1: примечание: кандидат: 'myString :: myString (const char *, std :: size_t) '23 | myString :: myString (const char * cPnt, std :: size_t size): strLength (size) // конструктор для получения размера и const ptr для char | ^ ~~~~~~~ myString.cpp: 23: 1: примечание: кандидат ожидает 2 аргумента, 1 предоставлен myString.cpp: 14: 1: примечание: кандидат: 'myString :: myString (const char *)' 14 | myString :: myString (const char * cPnt): strLength (strlen (cPnt)) // конструктор для инициализации заданной const ptr в char. | ^ ~~~~~~~ myString.cpp: 14: 32: примечание: неизвестное преобразование аргумента 1 из myString * в const char * 14 | myString :: myString (const char * cPnt): strLength (strlen (cPnt)) // конструктор для инициализации заданной const ptr в char. | ~~~~~~~~~~~~ ^ ~~~ myString.cpp: 8: 1: примечание: кандидат: 'myString :: myString ()' 8 | myString :: myString () // конструктор по умолчанию: инициализирует пустую строку. | ^ ~~~~~~~ myString.cpp: 8: 1: примечание: кандидат ожидает 0 аргументов, 1 предоставлен
обновление: определение всего класса
#ifndef MYSTRINGVECTOR_HPP
#define MYSTRINGVECTOR_HPP
#include "myString.hpp"
#include <initializer_list>
class myStringVector{
private:
myString *first, *last;
int limit = 0;
public:
void reserve(int); //allocate memory at 'first' for n myString's
myStringVector(); //call to reserve(0)
myStringVector(std::initializer_list<myString>);
myStringVector(const myStringVector&);
bool empty();
bool operator==(const myStringVector&);
myString operator[](int);
int getSize() const;
};
#endif // MYSTRINGVECTOR_HPP_INCLUDED
.cpp файл
#include "myStringVector.hpp"
#include "myMemory.hpp"
#include <initializer_list>
void myStringVector::reserve(int n){
this->first = allocate<myString>(n);
this->last = first+n;
this->limit = n+1;
}
myStringVector::myStringVector(){
this->reserve(0);
}
myStringVector::myStringVector(std::initializer_list<myString> list){
this->reserve(list.size());
for(int i = 0; i < limit-1; i++){
construct(first+i, list.begin()[i]);
}
}
myStringVector::myStringVector(const myStringVector& data){
reserve((data.limit)-1);
for(int i = 0; i < data.limit-1; i++){
construct(first+i, data.first+i);
}
}
bool myStringVector::empty(){
return (limit-1 == 0);
}
bool myStringVector::operator==(const myStringVector& data){
std::cout << limit << " " << data.limit << std::endl;
if(this->limit != data.limit)
return 0;
for(int i = 0; i < limit; i++){
if(*(first+i) != *(data.first+i))
return 0;
}
return 1;
}
myString myStringVector::operator[](int index){
return *(first+index);
}
int myStringVector::getSize() const{
return limit-1;
}
форматирование немного не работает, потому что загрузка кода в stackoverflow утомительна, насколько это возможно.
for(int i = 0; i < limit-1; i++)
, а в другомfor(int i = 0; i < limit; i++)
. Я не понимаю, почему вы вообще добавили 1 кlimit
; кажется, это не служит другой цели, кроме как призыв к ошибкам. Также остается загадкой, какова цельlast
. - person David K   schedule 28.11.2020