template <typename Object>
class Vector1 {
public:
explicit Vector1(const Object & value = Object()) : size_{0} {
array_ = new Object{value};
size_++;
}
Vector1(const Vector1 & rhs) : size_{rhs.size_} { //copy constructor
array_ = new Object[size_];
for (int i = 0; i < size_; i++) {
array_[i] = rhs.array_[i];
}
}
Vector1 & operator=(const Vector1 & rhs) { //copy assignment operator
array_ = new Object[rhs.size_];
if (this != &rhs) {
size_ = rhs.size_;
for (int i = 0; i < size_; i++) {
array_[i] = rhs.array_[i];
}
}
return *this;
}
Vector1(Vector1 && rhs) : array_{rhs.array_}, size_{rhs.size_} { //move constructor
rhs.array_ = nullptr;
rhs.size_ = 0;
}
Vector1 & operator=(Vector1 && rhs) { //move assignment operator
if (this != &rhs) {
std::swap(size_, rhs.size_);
std::swap(array_, rhs.array_);
}
return *this;
}
void print(ostream & out) const {
for (int i = 0; i < size_; i++) {
out << array_[i] << " ";
}
}
void ReadVector1() {
int count = 0;
cout << "Enter a size: ";
cin >> size_;
array_ = new Object[size_];
for (int i = 0; i < size_; i++) {
cout << "Enter element " << count + 1 << ": ";
cin >> array_[i];
count++;
}
}
size_t Size() const {
return size_;
}
**Vector1 operator+=(Vector1 & rhs) {
size_t combosize = size_ + rhs.size_;
Object combo[combosize];
int count = 0, rhscount = 0;
for (int i = 0; i < combosize; i++) {
if (i % 2 == 0) {
combo[i] = array_[count];
count++;
}
else {
combo[i] = rhs.array_[rhscount];
rhscount++;
}
}
std::swap(combosize, rhs.size_);
std::swap(combo, rhs.array_);
return *this;
}
Vector1 operator+(const Vector1 & rhs) const {
Vector1 temp(*this);
temp += rhs;
return temp;
}**
~Vector1() { //destructor
delete[] array_;
}
private:
size_t size_;
Object *array_;
};
template <typename Object>
ostream & operator<<(ostream & out, const Vector1<Object> & rhs) {
rhs.print(out);
return out;
}
int main(int argc, char **argv) {
Vector1<string> a, b;
a.ReadVector1(); //user provides input for Vector1 a
cout << a << endl;
b.ReadVector1(); //user provides input for Vector1 b
cout << b << endl;
cout << a + b << endl; //concatenates the two Vector1s
Vector1<string> d = a + b;
cout << d;
return 0;
}
Выше мой код (до сих пор). То, что я пытаюсь выполнить, - объединить динамический массив с динамическим массивом b (я не могу использовать векторы или любые STL, это должно быть элементарной имитацией вектора).Конкатенация двух динамических массивов строк?
Пример:
Пользователь вводит размер 2 для входов и «Привет» и «Мир». Пользователь вводит размер 2 для b и вводит «До свидания» и «Мир». Выход должен быть «Hello World Goodbye World».
Я подчеркнул, что проблема заключается в перегрузке операторов + и +. Мое рассуждение состоит в том, что я создаю новый массив, заполняю его значением из a и b, меняю местами значения, а затем возвращаю предполагаемое конкатенацию.
Мое рассуждение может показаться неизученным, потому что, честно говоря, я совершенно смущен тем, как продолжить это.
Почему не 'Vector1' также использовать копирование/обмен в' 'оператор =? Это не исключение. – PaulMcKenzie
Почему это не безопасно? Должен ли я заменить цикл for на своп? – dc90
Я должен уточнить и сказать, что оператор присваивания ошибочен. Вам не удалось «удалить []] память, на которую указывает __ray] (ошибка). Если вы попытаетесь исправить это, выпуская 'delete [] _array;' вверх, то это не исключение, так как последующий вызов 'new []' в этой функции может вызвать исключение, таким образом испортив ваш объект, так как вы 'разрушен '_array'. Вместо всего этого просто реализуйте функцию copy/swap для функции. – PaulMcKenzie