使用移动构造函数时如何获取指向新变量的指针
Posted
技术标签:
【中文标题】使用移动构造函数时如何获取指向新变量的指针【英文标题】:How to get pointer to new variable when using a move constructor 【发布时间】:2020-04-09 16:02:55 【问题描述】:所以我得到了这个代码:
//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 *
的东西。基本上我需要一个指向 =
运算符的左值的指针,同时在所述运算符的重载中。有没有办法做到这一点,还是我要求一些不可能的事情?
【问题讨论】:
【参考方案1】:我还没有完全理解你的问题,因为不清楚你想用这个enable_movable_ptr
类实现什么。我认为你写operator=
的方式不正确。您正在尝试在指向 r 值的指针上显式调用 delete(可能首先在堆栈上分配,而且以后可能会通过其他一些机制被销毁)。
我建议考虑operator=
的复制和交换方法,这样您就不必担心检查是否将对象分配给自身。签名将是enable_movable_ptr<T>& operator=(enable_movable_ptr<T> other)
(注意按值传递)。
【讨论】:
enable_movable_ptr
基本上是任何从它继承的对象的外壳,允许它跟踪指向它的movable_ptr
指针的链接列表。将指针移动到链表的第一个movable_ptr
就可以了。问题是,我需要更改链接列表中所有movable_ptr
指向的位置,这将是operator=
分配内容的左值。另外,我不能真正更改签名,因为 move() 返回 A &&
。
首先,您可以更改签名,因为您有一个移动构造函数。所以std::move
会返回A &&
,但是move构造函数可以隐式转换成A
。
现在我对你想要的东西有了更好的理解:1)你可以做 static_cast以上是关于使用移动构造函数时如何获取指向新变量的指针的主要内容,如果未能解决你的问题,请参考以下文章
如何在构造函数中访问类变量以在不使用 C++ 中的 this 指针的情况下分配它们