Здраствуйте, помогите решить задание (2-а дня плавится мозг).
Условие: Задание повышенной сложности. Реализуйте класс SharedPtr как описано ранее. Задание немного сложнее, чем кажется на первый взгляд. Уделите особое внимание «граничным случаям» - нулевой указатель, присваивание самому себе, вызов reset на нулевом SharedPtr и прочее. Hint: возможно, вам понадобится завести вспомогательную структуру. Код к заданию:
struct Number;
struct BinaryOperation;
struct FunctionCall;
struct Variable;
struct SharedPtr
{
// реализуйте следующие методы
//
// explicit SharedPtr(Expression *ptr = 0)
// ~SharedPtr()
// SharedPtr(const SharedPtr &)
// SharedPtr& operator=(const SharedPtr &)
// Expression* get() const
// void reset(Expression *ptr = 0)
// Expression& operator*() const
// Expression* operator->() const
};
Моя реализация (1-й день):
Expression *ptr_;
int *refs;
void clear(){
if (!--*refs){
delete ptr_;
delete refs;
}
}
explicit SharedPtr(Expression *ptr = 0)
: ptr_(ptr), refs(new int(1))
{}
~SharedPtr() {
clear();
}
SharedPtr(const SharedPtr &other)
: ptr_(other.ptr_), refs(other.refs)
{
++*refs;
}
SharedPtr& operator=(const SharedPtr & other) {
if (this != &other){
//clear();
ptr_ = other.ptr_;
refs = other.refs;
++*refs;
}
return *this;
}
//SharedPtr& operator=(Expression *ptr){
// if (ptr_ != ptr){
// ptr_ = ptr;
// *refs = 1;
// }
// return *this;
// }
Expression* get() const {
return ptr_;
}
void reset(Expression *ptr = 0) {
clear();
ptr_=ptr;
}
Expression& operator*() const {
return *ptr_;
}
Expression* operator->() const{
return ptr_;
}
};
День 2-й:
explicit SharedPtr(Expression *ptr = 0) {
this->ptr_ = ptr;
if( ptr == 0 )
this->reference_ = 0;
else
this->reference_ = new int(1);
}
~SharedPtr() {
if( this->reference_ != 0 )
this->reset();
}
SharedPtr(SharedPtr &other) {
if ( other.get() == this->ptr_ ) return;
this->ptr_ = other.get();
this->reference_ = other.get_reference_();
(*this->reference_)++;
}
SharedPtr& operator=(SharedPtr & other) {
if ( other.get() == this->ptr_ ) return *this;
this->reset();
this->ptr_ = other.get();
this->reference_ = other.get_reference_();
*(this->reference_) += 1;
return *this;
}
Expression* get() const {
return this->ptr_;
}
void reset(Expression *ptr = 0) {
if( this->reference_ == 0 && this->ptr_ == 0 ) return;
*(this->reference_) = *(this->reference_) - 1;
if( *this->reference_ == 0 && this->reference_ != 0){
delete this->ptr_;
delete this->reference_;
}
this->reference_ = 0;
this->ptr_ = 0;
}
Expression& operator*() const {
return *(this->ptr_);
}
Expression* operator->() const{
return this->ptr_;
}
int* get_reference_() { return this->reference_; }
private:
Expression *ptr_;
int * reference_;
};
Люди реализовывали без доп, структур. Пишет не правельный ответ и все тут :((
Прошу помощи...