使用move构造函数时如何获得指向新变量的指针

问题描述 投票:0回答:1

所以我有此代码:

//movable_ptr.hpp
//Michal Cermak

template<typename T> class movable_ptr;

template<typename T> class enable_movable_ptr {
public:
    //default constructor
    enable_movable_ptr() {};

    //move constructor and assignment
    enable_movable_ptr(enable_movable_ptr<T>&& p) {
        first_ = p.getFirst();
        p.retarget_to(this);
    };
    enable_movable_ptr<T>& operator=(enable_movable_ptr<T>&& p) {
        if (this != &p)
        {
            first_ = p.getFirst();
            p.retarget_to(this);
            delete &p;
        }
        return *this;
    };

    //retargets all pointers in the linked list to a new address
    void retarget_to(T* p)
    {
        if (first_ != nullptr)
        {
            auto current = first_;
            do
            {
                current->set(p);
                current = current->getNext();
            } while (current != first_);
        }
    };

    movable_ptr<T>* getFirst() { return first_; };
    void setFirst(movable_ptr<T>* p) { first_ = p; };
private:
    movable_ptr<T>* first_ = nullptr;
};

template<typename T> class movable_ptr {
public:
    //constructors and stuff...

    //access to variables
    T* get() {return ptr_; };
    void set(T* p) { ptr_ = p; };
    movable_ptr<T>* getNext() { return next_; };
    void setNext(movable_ptr<T>* p) { next_ = p; };
    movable_ptr<T>* getPrevious() {return prev_; };
    void setPrevious(movable_ptr<T>* p) { prev_ = p; };

private:
    T* ptr_ = nullptr;
    movable_ptr<T>* next_ = this;
    movable_ptr<T>* prev_ = this;
};

我的问题是我需要将T *赋予retarget_to,但是我在移动构造函数中使用了retarget_to(this),并在enable_movable_ptr中使用了赋值。这样就通过了enable_movable_ptr<T> *,而不仅仅是T *。问题是,我假设T继承自enable_movable_ptr,它将永远不会直接使用,只能通过从其继承的对象来使用。例如:

class A : public enable_movable_ptr<A>
{
public:
    int val;

    A(int val) : val(val) {}
};

然后像这样使用:

A x(42);
A y = move(x);

在这种情况下,this应该是enable_movable_ptr<A> *,但是我需要一些可以给我A *的东西。基本上,我需要一个指向=运算符的左值的指针,而在该运算符的重载内。有没有办法做到这一点,还是我要求做一些不可能的事情?

c++ pointers lvalue move-constructor
1个回答
0
投票

我还没有完全理解您的问题,因为尚不清楚您要使用此enable_movable_ptr类实现什么目标。我认为您的写作方式operator=格式错误。您试图在指向r值的指针上显式调用delete(它可能首先分配在堆栈上,而且以后可能还会通过其他某种机制销毁)。

我建议考虑为operator=使用复制和交换方法,这将使您不必担心是否将对象分配给自己。签名为enable_movable_ptr<T>& operator=(enable_movable_ptr<T> other)(注意按值传递)。

© www.soinside.com 2019 - 2024. All rights reserved.