Tôi bắt đầu học c + + nhưng tôi bị mắc kẹt trong destructor. Chúng ta cần phải thực hiện một vector và đây là những gì tôi có cho đến nay.Thực hiện một destructor ảo trong C + +
#include<string.h>
#include<cassert>
#include<iostream>
using namespace std;
template<class T>
class Vector {
template<class U> friend ostream& operator<<(ostream&, const Vector<U>&);
private:
T* data;
unsigned len;
unsigned capacity;
public:
Vector(unsigned = 10);
Vector(const Vector<T>&);
virtual ~Vector(void);
Vector<T>& operator =(const Vector<T>&);
bool operator==(const Vector<T>&);
T& operator[](unsigned);
};
//PROBLEM!
template <class T>
~ Vector() {
delete data;
}
template<class T>
Vector<T>::Vector(unsigned int _capacity)
{
capacity = _capacity;
len = _capacity;
data = new T[_capacity];
}
template<class T>
Vector<T>::Vector(const Vector<T> & v)
{
len = v.len;
capacity = v.capacity;
data = new T[len];
for (unsigned int i = 0; i < len; i++)
data[i] = v.data[i];
}
template<class T>
Vector<T> & Vector<T>::operator = (const Vector<T> & v)
{
delete[ ] data;
len = v.len;
capacity = v.capacity;
data = new T [len];
for (unsigned int i = 0; i < len; i++)
data[i] = v.data[i];
return *this;
}
template<class T>
bool Vector<T>::operator == (const Vector<T> & v)
{
bool check = true;
check &= (len == v.len);
if (!check) return false;
check &= (capacity == v.capacity);
if (!check) return false;
for (unsigned int i = 0; i < len; i++) {
check &= (data[i] == v.data[i]);
if (!check) return false;
}
return true;
}
template<class T>
T& Vector<T>::operator[](unsigned int index)
{
return data[index];
}
Giao diện được cung cấp và tôi cần triển khai. Nhưng điều này rất khác với C và Java, rằng tôi hơi lạc mất.
Trong cuộc tập trận thứ hai chúng ta cần phải thực hiện một cái gì đó như thế này bằng cách sử dụng) thực hiện Vector trước khi lớp có nguồn gốc và b) Vector như lớp thành phần, vì vậy có lẽ chúng ta sẽ sử dụng các destructor ảo trong một trong những cách tiếp cận ?
void testAssociativeArray() {
AssociativeArray<String, int> table;
table["abc"] = 15;
table["jkl"] = 12;
table["xyz"] = 85;
assert(table["jkl"], 12);
}
template<class P, class Q>
class Pair {
P p;
Q q; public:
Pair(const P& _p = P(), const Q& _q = Q()): p(_p), q(_q) {}
P& objectP() {return p;}
Q& objectQ() {return q;}
};
Chỉ cần lưu ý: bạn có thể cải thiện toán tử '= = bằng cách lấy đối số được truyền theo giá trị và sử dụng thành ngữ" sao chép và trao đổi "(http://stackoverflow.com/questions/3279543/ what-is-the-copy-and-swap-idiom) –