operator= - code in overloaded function doesn't get called

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Tobias Langner

    operator= - code in overloaded function doesn't get called

    I overloaded the operator= - but in the program, if the line p3=p1 gets
    executed, the program doesn't jump to the method.

    The class definition and the test code.

    template <class T, template <class> class OwnershipPolicy >
    class SmartPtr : public OwnershipPolicy <T> {
    public:
    explicit SmartPtr(T* pointer);
    SmartPtr(const SmartPtr<T, OwnershipPolicy >& otherPointer);
    SmartPtr<T, OwnershipPolicy > &operator=(cons t SmartPtr<T, OwnershipPolicy >
    &);
    ~SmartPtr();
    T& operator*() const;
    T* operator->() const;

    private:
    void deleteObject();
    void copyPtr(const SmartPtr<T, OwnershipPolicy >& otherPointer);
    SmartPtr();
    T* pointer_;

    };

    //The Testcode:

    bool testSmartPtr() {
    SmartPtr<LongWr apper, RefCount> *p1=new SmartPtr<LongWr apper,
    RefCount>(new LongWrapper(1)) ;
    SmartPtr<LongWr apper, RefCount> *p2=new SmartPtr<LongWr apper,
    RefCount>(new LongWrapper(20) );
    SmartPtr<LongWr apper, RefCount> *p3=new SmartPtr<LongWr apper,
    RefCount>(*p2);



    std::cout<<"p1= p3\n";
    p3=p1;

    std::cout<<"del ete p1\n";
    delete p1;
    std::cout<<"del ete p2\n";
    delete p2;
    std::cout<<"del ete p3\n";
    delete p3;

    return true;
    }
  • John Harrison

    #2
    Re: operator= - code in overloaded function doesn't get called


    "Tobias Langner" <tobias.langner @t-online.de> wrote in message
    news:bgal7l$16c $07$2@news.t-online.com...[color=blue]
    > I overloaded the operator= - but in the program, if the line p3=p1 gets
    > executed, the program doesn't jump to the method.
    >
    > The class definition and the test code.
    >
    > template <class T, template <class> class OwnershipPolicy >
    > class SmartPtr : public OwnershipPolicy <T> {
    > public:
    > explicit SmartPtr(T* pointer);
    > SmartPtr(const SmartPtr<T, OwnershipPolicy >& otherPointer);
    > SmartPtr<T, OwnershipPolicy > &operator=(cons t SmartPtr<T,[/color]
    OwnershipPolicy >[color=blue]
    > &);
    > ~SmartPtr();
    > T& operator*() const;
    > T* operator->() const;
    >
    > private:
    > void deleteObject();
    > void copyPtr(const SmartPtr<T, OwnershipPolicy >& otherPointer);
    > SmartPtr();
    > T* pointer_;
    >
    > };
    >
    > //The Testcode:
    >
    > bool testSmartPtr() {
    > SmartPtr<LongWr apper, RefCount> *p1=new SmartPtr<LongWr apper,
    > RefCount>(new LongWrapper(1)) ;
    > SmartPtr<LongWr apper, RefCount> *p2=new SmartPtr<LongWr apper,
    > RefCount>(new LongWrapper(20) );
    > SmartPtr<LongWr apper, RefCount> *p3=new SmartPtr<LongWr apper,
    > RefCount>(*p2);
    >
    >
    >
    > std::cout<<"p1= p3\n";
    > p3=p1;
    >
    > std::cout<<"del ete p1\n";
    > delete p1;
    > std::cout<<"del ete p2\n";
    > delete p2;
    > std::cout<<"del ete p3\n";
    > delete p3;
    >
    > return true;
    > }[/color]

    Well that's because p1, p2 and p3 are pointers.

    I think perhaps what you meant to write is

    SmartPtr<LongWr apper, RefCount> p1=SmartPtr<Lon gWrapper, RefCount>(new
    LongWrapper(1)) ;
    SmartPtr<LongWr apper, RefCount> p2=SmartPtr<Lon gWrapper, RefCount>(new
    LongWrapper(20) );
    SmartPtr<LongWr apper, RefCount> p3=p2;
    std::cout<<"p1= p3\n";
    p3=p1;

    You seem to be getting your smart pointers and your ordinary pointers mixed
    up.

    john


    Comment

    • Jakob Bieling

      #3
      Re: operator= - code in overloaded function doesn't get called

      "Tobias Langner" <tobias.langner @t-online.de> wrote in message
      news:bgal7l$16c $07$2@news.t-online.com...[color=blue]
      > I overloaded the operator= - but in the program, if the line p3=p1 gets
      > executed, the program doesn't jump to the method.
      >
      > The class definition and the test code.
      >
      > template <class T, template <class> class OwnershipPolicy >
      > class SmartPtr : public OwnershipPolicy <T> {
      > public:
      > explicit SmartPtr(T* pointer);
      > SmartPtr(const SmartPtr<T, OwnershipPolicy >& otherPointer);
      > SmartPtr<T, OwnershipPolicy > &operator=(cons t SmartPtr<T,[/color]
      OwnershipPolicy >[color=blue]
      > &);
      > ~SmartPtr();
      > T& operator*() const;
      > T* operator->() const;
      >
      > private:
      > void deleteObject();
      > void copyPtr(const SmartPtr<T, OwnershipPolicy >& otherPointer);
      > SmartPtr();
      > T* pointer_;
      >
      > };
      >
      > //The Testcode:
      >
      > bool testSmartPtr() {
      > SmartPtr<LongWr apper, RefCount> *p1=new SmartPtr<LongWr apper,
      > RefCount>(new LongWrapper(1)) ;
      > SmartPtr<LongWr apper, RefCount> *p2=new SmartPtr<LongWr apper,
      > RefCount>(new LongWrapper(20) );
      > SmartPtr<LongWr apper, RefCount> *p3=new SmartPtr<LongWr apper,
      > RefCount>(*p2);
      >
      >
      >
      > std::cout<<"p1= p3\n";
      > p3=p1;[/color]

      'p3' and 'p1' are pointers, not objects. That is why the operator= for
      the 'object' does not get called, but the operator= for the 'pointer'. The
      original value for 'p3' is lost, meaning you also have a memory leak.
      [color=blue]
      > std::cout<<"del ete p1\n";
      > delete p1;
      > std::cout<<"del ete p2\n";
      > delete p2;
      > std::cout<<"del ete p3\n";
      > delete p3;[/color]

      You have undefined behaviour here, because above you made 'p1' and 'p3'
      point to the same object, which you now try to delete a second time. Your
      program might have crashed here.
      [color=blue]
      > return true;
      > }[/color]

      hth
      --
      jb

      (replace y with x if you want to reply by e-mail)


      Comment

      Working...