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'初始化其他类中的引用的主要内容,如果未能解决你的问题,请参考以下文章