c++ - 如何使用构造函数中的'this'初始化其他类中的引用

Posted

技术标签:

【中文标题】c++ - 如何使用构造函数中的\'this\'初始化其他类中的引用【英文标题】:c++ - how to initialise reference in other class using 'this' from constructorc++ - 如何使用构造函数中的'this'初始化其他类中的引用 【发布时间】:2015-09-21 21:02:59 【问题描述】:

我有两个类,Node 和 Bond;创建新键时,我想在键的每一侧的节点中添加对“adjBonds”向量的引用(从化学意义上考虑,键连接两个原子) 我找不到获取对当前类(节点)的引用的方法;我必须使用指针吗?我该怎么做?

另外,如果 std::vectors 在类中声明,我是否必须清理它们?我必须先清理这些向量中的引用,还是引用不需要内存管理?

class Node

public:
    std::vector<Bond &> m_adjBonds;
    ELEMENT m_element;
    Node(ELEMENT element)
        :m_element(element)
    
    

;

class Bond

public:
    int m_bondNumber;
    Node &m_end1;
    Node &m_end2;

    Bond(int bondNumber, Node &end1, Node& end2)
        :m_end1(end1), m_end2(end2), m_bondNumber(bondNumber)
    
        m_end1.m_adjBonds.push_back(this);
    
;

编译器在“this”上返回错误,说“对非常量的引用的初始值必须是左值”,但我不确定这是什么意思。

【问题讨论】:

一切都有明确定义的生命周期。它要么是全局的并且始终存在,要么使用 new 手动分配并且存在直到它被删除,要么存在于当前堆栈帧中。换句话说,如果没有更多信息,就不可能知道何时应该清理向量中的引用/指针。 【参考方案1】:

简短的回答是您不能拥有vector 的引用。只需将您的会员更改为:

std::vector<Bond*> m_adjBonds;

这样做的原因是,一旦您分配了一个参考,您就不能重新分配它。在重新分配的情况下,向量需要能够重新分配(复制/移动)其内部元素,并且引用既不可复制也不可移动。

使用 C++11,您可以通过 std::reference_wrapper 使这种关系更加明确:

std::vector<std::reference_wrapper<Bond>> m_adjBonds;

在这种情况下,您必须取消引用 this 才能执行 push_back

m_end1.m_adjBonds.push_back(*this);

对于内存清理,由于您使用vector 来管理绑定,因此该类本身将正确处理自己的内存分配和释放。您在示例中没有进行任何其他分配,因此您无需进行其他清理。

【讨论】:

以上是关于c++ - 如何使用构造函数中的'this'初始化其他类中的引用的主要内容,如果未能解决你的问题,请参考以下文章

如何在构造函数中访问类变量以在不使用 C++ 中的 this 指针的情况下分配它们

如何在c ++中的类构造函数中将整个数组初始化为单个元素

如何验证 C++ 构造函数中的输入参数?

带有数组的 C++ 构造函数初始化列表

C++中的类和对象

如何避免在 C++ 中调用祖父构造函数?