2013-08-29 2 views
0

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

Wrapper W; 
W[0] = value; //overloaded index operator, forwards to the vector 
+0

Возможно, конструктор не должен делать ничего, и вместо 'оператор []' должен проверить размер и 'изменить размер()' вектору убедитесь, что 'i' находится в зоне действия (остерегайтесь аннулирования предыдущих ссылок)? В противном случае, это полная догадка, насколько большой вектор должен быть, поэтому никто не может действительно сказать, как должен выглядеть ваш конструктор по умолчанию. – Cornstalks

+0

Извините за опечатку, я имел в виду W [0], а не W [i]. – user2696565

+0

Если все, что вам нужно, это 'W [0]', то конструктор может быть 'Wrapper(): m_vector (1) {}' – Cornstalks

ответ

1

Вы должны изменить размер вектора, прежде чем получить доступ к элементу:

// in the class definition 
std::vector vec; 

T &operator[](typename std::vector<T>::size_type idx) 
{ 
    if (idx >= vec.size()) { 
     vec.resize(idx + 1); 
    } 

    return vec[idx]; 
} 

Edit: Теперь 0 вместо i, это огромная опечатки. В этом случае, вы можете просто построить вектор размера 1 на месте:

std::vector<T> vec = std::vector<T>(1); 

public: 
T &operator[](typename std::vector<T>::size_type idx) 
{ 
    return vec[idx]; 
} 
1

конструктор по умолчанию не имеет никакого значения. Ваш operator [] должен проверить, находится ли поставленный индекс вне диапазона, и при необходимости увеличивать вектор. (Я предполагаю, что «возвращает ссылку на vector<T>» - это опечатка, и вы хотите переслать вектор operator[] в какой-то момент).

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