LINUX.ORG.RU

Сообщения green_day

 

Реализуйте класс SharedPtr

Здраствуйте, помогите решить задание (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_;
};

Люди реализовывали без доп, структур. Пишет не правельный ответ и все тут :((

Прошу помощи...

 

green_day
()

RSS подписка на новые темы