c++ - 复制时跟踪所属类的 `this` 的数据成员

标签 c++ c++11

我有一个带有数据成员的类,该类将外部 this 作为其所有者进行跟踪。我想要做的是在复制构造后跟踪新的所有者

class MyType;

struct Member {
  MyType* owner;
  Member(MyType* m) : owner{m} {} // store pointer to owner
};

struct MyType {
    Member mem;
    MyType() : mem(this) { } // I am my member's owner
};

int main() {
  MyType a;
  MyType b(a);
  assert(b.mem.owner == &b); // fail.
}

当然,我可以编写 MyType(const MyType&); 构造函数并设置新指针,但它所在的实际类很大,编写构造函数会引入维护问题。如果我可以限制它(甚至引入另一个中间类/包装器)我会更高兴。

现实世界的情况是一个 unique_ptr 成员,其删除器引用了拥有的this,所以实际上我只需要移动操作。到目前为止,我所想到的一切都还很不成熟。

最佳答案

您可以创建一个新类来处理所有权更改。将现有的 MyType 重命名为 MyTypeImpl (成员不变)并创建一个从中派生的新 MyType:

struct Member {
    MyType* owner;
    Member(MyType* m) : owner{m} {} // store pointer to owner
};

struct MyTypeImpl {
    Member mem;
protected:
    // protected constructor to disallow creating instances of this class
    MyTypeImpl(MyType *pThis) : mem(pThis) { } // I am my member's owner
};

struct MyType: public MyTypeImpl {
    MyType(): MyTypeImpl(this) { }
    MyType(const MyType &r): MyTypeImpl(r) { mem.owner = this; }
    MyType(MyType &&r): MyTypeImpl(std::forward(r)) { mem.owner = this; }
    // etc
};

成员的一个变体是指向 MyTypeImpl 而不是 MyType(那么 MyTypeImpl 将与您发布的内容保持不变,除了重命名之外)。

关于c++ - 复制时跟踪所属类的 `this` 的数据成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33226478/

相关文章:

c++ - Linux中共享对象和普通库的区别

c++ - 需要有关基本 Windows C 的帮助

c++ - 在 C++ 中如何使用模板调用提供类型的特定成员

c++ - std::vector 中的字符串验证

c++ - const std::unordered_map<char, int>' as ‘this’ 参数丢弃 lambda 中的限定符

c++ - 通过语音在字典中查找单词

c++ - sizeof(variableName or expression) 和 sizeof(decltype(variableName or expression)) 一样吗?

c++ - false 隐式转换为空指针

c++ - Lambda 函数作为参数传递

c++ - 在 C++ 中不允许多参数 operator[] 的根本原因