История изменений
Исправление dissident, (текущая версия) :
by a new-expression
Прицепился к malloc'у. Ну хорошо, не malloc, так new. А это что не array object?
int* array = operator new(sizeof(int)*N);
? Если даже by definition нет, то «класть» туда int'ы и обращаться к ним по
array[i]
Если нет, то Herb Sutter в примере из exceptional C++ (item 12, 13) явно не знает C++:
template <class T> class StackImpl
{
/*????*/:
StackImpl(size_t size=0);
~StackImpl();
void Swap(StackImpl& other) throw();
T* v_; // ptr to a memory area big
size_t vsize_; // enough for 'vsize_' T's
size_t vused_; // # of T's actually in use
private:
// private and undefined: no copying allowed
StackImpl( const StackImpl& );
StackImpl& operator=( const StackImpl& );
};
template <class T>
StackImpl<T>::StackImpl( size_t size )
: v_( static_cast<T*>
( size == 0
? 0
: operator new(sizeof(T)*size) ) ),
vsize_(size),
vused_(0)
{
}
template <class T>
class Stack : private StackImpl<T>
{
public:
Stack(size_t size=0)
: StackImpl<T>(size)
{
}
// construct() constructs a new object in
// a given location using an initial value
//
template <class T1, class T2>
void construct( T1* p, const T2& value )
{
new (p) T1(value);
}
Stack(const Stack& other)
: StackImpl<T>(other.vused_)
{
while( vused_ < other.vused_ )
{
construct( v_+vused_, other.v_[vused_] );
++vused_;
}
}
T& Top()
{
if( vused_ == 0 )
{
throw "empty stack";
}
return v_[vused_-1];
}
Посмотри на конструкцию
v_+vused
return v_[vused_-1]
Исправление dissident, :
by a new-expression
Прицепился к malloc'у. Ну хорошо, не malloc, так new. А это что не array object?
int* array = operator new(sizeof(int)*N);
? Если даже by definition нет, то «класть» туда int'ы и обращаться к ним по
array[i]
Если нет, то Herb Sutter в примере из exceptional C++ (item 12, 13) явно не знает C++:
template <class T> class StackImpl
{
/*????*/:
StackImpl(size_t size=0);
~StackImpl();
void Swap(StackImpl& other) throw();
T* v_; // ptr to a memory area big
size_t vsize_; // enough for 'vsize_' T's
size_t vused_; // # of T's actually in use
private:
// private and undefined: no copying allowed
StackImpl( const StackImpl& );
StackImpl& operator=( const StackImpl& );
};
template <class T>
StackImpl<T>::StackImpl( size_t size )
: v_( static_cast<T*>
( size == 0
? 0
: operator new(sizeof(T)*size) ) ),
vsize_(size),
vused_(0)
{
}
template <class T>
class Stack : private StackImpl<T>
{
public:
Stack(size_t size=0)
: StackImpl<T>(size)
{
}
// construct() constructs a new object in
// a given location using an initial value
//
template <class T1, class T2>
void construct( T1* p, const T2& value )
{
new (p) T1(value);
}
Stack(const Stack& other)
: StackImpl<T>(other.vused_)
{
while( vused_ < other.vused_ )
{
construct( v_+vused_, other.v_[vused_] );
++vused_;
}
}
T& Top()
{
if( vused_ == 0 )
{
throw "empty stack";
}
return v_[vused_-1];
}
Посмотри на конструкцию
"v_+vused"
return v_[vused_-1]
Исправление dissident, :
by a new-expression
Прицепился к malloc'у. Ну хорошо, не malloc, так new. А это что не array object?
int* array = operator new(sizeof(int)*N);
? Если даже by definition нет, то «класть» туда int'ы и обращаться к ним по array вполне себе можно.
Если нет, то Herb Sutter в примере из exceptional C++ (item 12, 13) явно не знает C++:
template <class T> class StackImpl
{
/*????*/:
StackImpl(size_t size=0);
~StackImpl();
void Swap(StackImpl& other) throw();
T* v_; // ptr to a memory area big
size_t vsize_; // enough for 'vsize_' T's
size_t vused_; // # of T's actually in use
private:
// private and undefined: no copying allowed
StackImpl( const StackImpl& );
StackImpl& operator=( const StackImpl& );
};
template <class T>
StackImpl<T>::StackImpl( size_t size )
: v_( static_cast<T*>
( size == 0
? 0
: operator new(sizeof(T)*size) ) ),
vsize_(size),
vused_(0)
{
}
template <class T>
class Stack : private StackImpl<T>
{
public:
Stack(size_t size=0)
: StackImpl<T>(size)
{
}
// construct() constructs a new object in
// a given location using an initial value
//
template <class T1, class T2>
void construct( T1* p, const T2& value )
{
new (p) T1(value);
}
Stack(const Stack& other)
: StackImpl<T>(other.vused_)
{
while( vused_ < other.vused_ )
{
construct( v_+vused_, other.v_[vused_] );
++vused_;
}
}
T& Top()
{
if( vused_ == 0 )
{
throw "empty stack";
}
return v_[vused_-1];
}
Посмотри на конструкцию
"v_+vused"
return v_[vused_-1]
Исправление dissident, :
by a new-expression
Прицепился к malloc'у. Ну хорошо, не malloc, так new. А это что не array object?
int* array = operator new(sizeof(int)*N);
?
Если нет, то Herb Sutter в примере из exceptional C++ (item 12, 13) явно не знает C++:
template <class T> class StackImpl
{
/*????*/:
StackImpl(size_t size=0);
~StackImpl();
void Swap(StackImpl& other) throw();
T* v_; // ptr to a memory area big
size_t vsize_; // enough for 'vsize_' T's
size_t vused_; // # of T's actually in use
private:
// private and undefined: no copying allowed
StackImpl( const StackImpl& );
StackImpl& operator=( const StackImpl& );
};
template <class T>
StackImpl<T>::StackImpl( size_t size )
: v_( static_cast<T*>
( size == 0
? 0
: operator new(sizeof(T)*size) ) ),
vsize_(size),
vused_(0)
{
}
template <class T>
class Stack : private StackImpl<T>
{
public:
Stack(size_t size=0)
: StackImpl<T>(size)
{
}
// construct() constructs a new object in
// a given location using an initial value
//
template <class T1, class T2>
void construct( T1* p, const T2& value )
{
new (p) T1(value);
}
Stack(const Stack& other)
: StackImpl<T>(other.vused_)
{
while( vused_ < other.vused_ )
{
construct( v_+vused_, other.v_[vused_] );
++vused_;
}
}
T& Top()
{
if( vused_ == 0 )
{
throw "empty stack";
}
return v_[vused_-1];
}
Посмотри на конструкцию
"v_+vused"
return v_[vused_-1]
Исходная версия dissident, :
by a new-expression
Прицепился к malloc'у. Ну хорошо, не malloc, так new. А это что не array object?
int* array = operator new(sizeof(int)*N);
?
Если нет, то Herb Sutter в примере из exceptional C++ (item 12, 13) явно не знает C++:
template <class T> class StackImpl
{
/*????*/:
StackImpl(size_t size=0);
~StackImpl();
void Swap(StackImpl& other) throw();
T* v_; // ptr to a memory area big
size_t vsize_; // enough for 'vsize_' T's
size_t vused_; // # of T's actually in use
private:
// private and undefined: no copying allowed
StackImpl( const StackImpl& );
StackImpl& operator=( const StackImpl& );
};
template <class T>
StackImpl<T>::StackImpl( size_t size )
: v_( static_cast<T*>
( size == 0
? 0
: operator new(sizeof(T)*size) ) ),
vsize_(size),
vused_(0)
{
}
template <class T>
class Stack : private StackImpl<T>
{
public:
Stack(size_t size=0)
: StackImpl<T>(size)
{
}
// construct() constructs a new object in
// a given location using an initial value
//
template <class T1, class T2>
void construct( T1* p, const T2& value )
{
new (p) T1(value);
}
Stack(const Stack& other)
: StackImpl<T>(other.vused_)
{
while( vused_ < other.vused_ )
{
construct( v_+vused_, other.v_[vused_] );
++vused_;
}
}
T& Top()
{
if( vused_ == 0 )
{
throw "empty stack";
}
return v_[vused_-1];
}
Посмотри на конструкцию
"v_+vused"
return v_[vused_-1]