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對和輸入了「你好」和「世界」。 用戶輸入b的大小爲2並輸入「再見」和「世界」。 輸出應該是「Hello World Goodbye World」。
我突出了我認爲問題所在,即+和+ =運算符的重載。我的推理是我創建了一個新數組,用a和b中的值填充它,交換這些值,然後返回所需的連接。
我的推理可能聽起來不太合理,因爲坦率地說,我對如何繼續處理這個問題感到困惑。
爲什麼不'Vector1'還使用複製/交換在'運營商='?它並不是特別安全。 – PaulMcKenzie
爲什麼它不是安全的?我應該用交換替換for循環嗎? – dc90
我應該澄清並說分配運算符是錯誤的。你沒有'刪除'_array'指向的內存(錯誤)。如果你試圖通過發出一個'delete [] _array;'來解決這個問題,那麼它就不是異常安全的,因爲隨後在該函數中調用'new []'可能會拋出一個異常,從而使得你的對象已經摧毀了'_array'。代替所有這些,只需在函數上實現複製/交換。 – PaulMcKenzie