我的问题如下。我有一个向量类 elementList,其中包含沿表面描述三角形的元素,但是当我通过 emplace_back 将单独构造的元素添加到 elementList 中时,它们的地址会发生变化。
如果您需要更多代码,请告诉我,但我删除了多余的内容以获取我认为必需的内容。第一个元素列表:
class elementList
{
public:
elementList(std::string filename);
std::vector<element> const& get_elements() const;
private:
std::vector<element> m_elements;
};
我将源 txt 文件中的信息解析到其中。元素类,排除一些不必要的位,看起来像这样
class element
{
public:
element(float x11, float x12, float x21, float x22, float x31, float x32);
std::vector<Node> const& nodes() const;
std::vector<Edge> const& edges() const;
[...]
private:
std::vector<Node> m_nodes;
std::vector<Edge> m_edges;
[...]
};
所以我在构造 elementList 时解析源文件
elementList::elementList(std::string filename)
{
[...] //parse node coordinates from source file
m_elements.emplace_back(element(x11,x12,x21,x22,x31,x32)); //1
}
构建工作正常,但令我惊讶的是元素中顶级变量的地址发生了变化。如果例如在元素构造函数中我打印出来
element::element(float x11, float x12, float x21, float x22, float x31, float x32)
{
[...]
std::cout << &m_nodes[0] << std::endl;
}
我得到的地址与在 elementList 构造函数中并打印出来时不同
elementList::elementList(std::string filename)
{
[...]
m_elements.emplace_back(element(x11,x12,x21,x22,x31,x32)); //1
Node initialNode = m_elements.at(0).nodes().at(0);
std::cout << &initialNode;
}
所有元素都会发生这种情况,只有地址发生变化,节点值没有变化。有没有办法将元素追加到 elementList 并保持相同的内存地址?否则,这会丢失我存储在每个单独元素中的一些连接信息。
我的猜测是在步骤//1处代码实际上复制了元素而不是按原样插入它,有没有办法避免这种情况?