Я не читал это раньше, и это показалось мне странным, что я воспринимаю как типографские ошибки в таких хорошо продуманных Вне, хорошо написанная статья. Если я что -то не упускаю.
Код: Выделить всё
template
T* NewCopy( const T* src,
size_t srcsize,
size_t destsize ) {
assert( destsize >= srcsize );
T* dest = new T[destsize];
try {
copy( src, src+srcsize, dest ); // copy is part of the STL;
// see Item M35
} catch(...) {
delete[] dest; // this can't throw
throw; // rethrow original exception
}
return dest;
}
В определении конструктора копирования для стека class Шаблон: < /p>
Код: Выделить всё
template
Stack::Stack( const Stack& other )
: v_(NewCopy( other.v_,
other.vsize_,
other.vsize_ )),
vsize_(other.vsize_),
vused_(other.vused_)
{ }
Код: Выделить всё
template
Stack&
Stack::operator=( const Stack& other ) {
if( this != &other ) {
T* v_new = NewCopy( other.v_,
other.vsize_,
other.vsize_ );
delete[] v_; // this can't throw
v_ = v_new; // take ownership
vsize_ = other.vsize_;
vused_ = other.vused_;
}
return *this; // safe, no copy involved
}
Код: Выделить всё
template
void Stack::Push( const T& t ) {
if( vused_ == vsize_ ) // grow if necessary
{ // by some grow factor
size_t vsize_new = vsize_*2+1;
T* v_new = NewCopy( v_, vsize_, vsize_new );
delete[] v_; // this can't throw
v_ = v_new; // take ownership
vsize_ = vsize_new;
}
v_[vused_] = t;
++vused_;
}
это понимание правильно? < /p>
Подробнее здесь: https://stackoverflow.com/questions/794 ... ld-classic
Мобильная версия