gpt4 book ai didi

c++ - 传递 std::shared_ptr 的 std::vector,不更新对象

转载 作者:太空宇宙 更新时间:2023-11-04 12:43:41 25 4
gpt4 key购买 nike

好吧,我可能做错了,但我已经束手无策了。

我有一个我的节点类的 shared_ptr vector ,我为各种事情传递它,我的节点类有一个 share_ptr vector ,它是节点类型的邻居。

我有一个类可以为我生成节点网格,并返回 std::vector<std::shared_ptr<Node>> nodes , 和一个重要的 std::shared_ptr<Node> significant node .然后我将这个 vector 传递给一个索引器,该索引器创建第二个列表,该列表是第一个列表的子集,大小约为 10%,返回为 std::vector<std::shared_ptr<Node>> indexedNodes。 .

创建这些后,我将它们传递到另一个对象中以供以后引用。然后修改器类从 indexedNodes 中获取单个随机节点,并使用它遍历修改高度值的节点邻居。

稍后,当我将它们导出时,值显示为 0/initialized。

需要注意的是,我将数据传递给函数并返回 std::vector<std::shared_ptr<Node>>我认为这是我的问题,我只是不确定如何正确传递我的 shared_ptr 的容器,这样我就不会复制。

如果需要更多信息,请告诉我。我正在寻找我能理解的示例或引用。

对不起代码,它不漂亮,我使用动态加载的库。

完成工作的函数:

void cruthu::Cruthu::Run() {
std::shared_ptr<cruthu::ITeraGen> teraGen(this->mSettings.TeraGen.Factory->DLGetInstance());
std::vector<std::shared_ptr<cruthu::Node>> nodes(teraGen->Create());
std::shared_ptr<cruthu::Node> significantNode(teraGen->GetSignificantNode());

std::vector<std::shared_ptr<cruthu::IIndexer>> indexers;
for(const auto indexer : this->mSettings.Indexers) {
indexers.push_back(indexer.Factory->DLGetInstance());
}
std::vector<std::shared_ptr<cruthu::Node>> indexedNodes(indexers.at(0)->Index(nodes));

std::shared_ptr<cruthu::ITera> tera(this->mSettings.Tera.Factory->DLGetInstance());
tera->SetNodes(nodes);
tera->SetIndexedNodes(indexedNodes);
tera->SetSignificantNode(significantNode);

for(const auto & formaF : this->mSettings.Formas) {
std::shared_ptr<cruthu::IForma> forma(formaF.Factory->DLGetInstance());
forma->SetNode(tera->GetIndexedNode());
forma->Modify();

std::cout << std::to_string(tera->GetIndexedNode()->GetHeight()) << std::endl;
}

this->CreateImage(tera);
}

TeraGen:

#ifndef CRUTHU_ITERAGEN_HPP
#define CRUTHU_ITERAGEN_HPP

#include <cruthu/Node.hpp>

#include <vector>

namespace cruthu {
class ITeraGen {
public:
virtual ~ITeraGen() = default;

virtual std::vector<std::shared_ptr<cruthu::Node>> Create() = 0;
virtual std::shared_ptr<cruthu::Node> GetSignificantNode() = 0;
};
} // namespace cruthu
#endif

泰拉:

#ifndef CRUTHU_ITERA_HPP
#define CRUTHU_ITERA_HPP

#include <cruthu/IIndexer.hpp>
#include <cruthu/Node.hpp>

#include <memory>
#include <vector>

namespace cruthu {
class ITera {
public:
virtual ~ITera() = default;

virtual void SetNodes(std::vector<std::shared_ptr<cruthu::Node>>& nodes) = 0;
virtual void SetIndexedNodes(std::vector<std::shared_ptr<cruthu::Node>>& indexedNodes) = 0;
virtual void SetSignificantNode(std::shared_ptr<cruthu::Node> significantNode) = 0;
virtual std::vector<std::shared_ptr<cruthu::Node>>& GetNodes() = 0;
virtual std::vector<std::shared_ptr<cruthu::Node>>& GetIndexedNodes() = 0;
virtual std::shared_ptr<cruthu::Node> GetIndexedNode() = 0;
};
} // namespace cruthu
#endif

索引器:

#ifndef CRUTHU_IINDEXER_HPP
#define CRUTHU_IINDEXER_HPP

#include <cruthu/Node.hpp>

#include <memory>
#include <vector>

namespace cruthu {
class IIndexer {
public:
virtual ~IIndexer() = default;

virtual std::vector<std::shared_ptr<cruthu::Node>> Index(std::shared_ptr<cruthu::Node> node) = 0;
virtual std::vector<std::shared_ptr<cruthu::Node>> Index(std::vector<std::shared_ptr<cruthu::Node>>& nodes) = 0;
};
} // namespace cruthu
#endif

形式:

#ifndef CRUTHU_IFORMA_HPP
#define CRUTHU_IFORMA_HPP

#include <cruthu/Node.hpp>

namespace cruthu {
class IForma {
public:
virtual ~IForma() = default;

virtual void SetNode(std::shared_ptr<cruthu::Node> node) = 0;
virtual void Modify() = 0;
};
} // namespace cruthu
#endif

我确实更新并尝试在两者之间添加引用,这就是为什么他们现在在某些地方有引用。我仍然有同样的问题。

最佳答案

作为用户Remy Lebeau请提供一个最小的、完整的和可验证的示例。

正如您所说,您正在通过 std::vector<std::shared_ptr<Node>>从一个类到另一个类或从一个函数到另一个函数,并且它们没有更新并且初始化为 0。根据您描述的行为,我有一个问题要问您,我将其作为答案发布,因为评论太长了。

上面接受 vector 或共享指针的函数声明/定义看起来像这样吗:

void someFunc( std::vector<shared_ptr<Node> nodes ) { ... }

或者它看起来像这样吗:

void someFunc( std::vector<shared_ptr<Node>& nodes ) { ... }

我之所以这样问,是因为如果您按值而不是按引用传递容器,这会有所不同。

关于c++ - 传递 std::shared_ptr 的 std::vector,不更新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52798181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com