gpt4 book ai didi

C++ 访问类对象 vector 中的元素

转载 作者:太空狗 更新时间:2023-10-29 23:49:01 24 4
gpt4 key购买 nike

我试图访问类对象 vector 中的一个元素,但我没有做对。我猜构造函数/解构函数和引用有问题,但即使是其他问题,如 C++ destructor issue with std::vector of class objects , c++ vector of class object pointersC++ vector of objects vs. vector of pointers to objects .希望有人可以帮助我修复我的代码片段。

节点.h

class Node {

public:
Node();
Node(int id, const std::string& name);
Node(const Node& orig);
virtual ~Node();

void cout(void);

int get_id(void);

private:
int _id;
std::string _name;

};

节点.cpp

#include "node.h"

Node::Node() {
}

Node::Node(int id, const std::string& name) : _id(id), _name(name) {
this->cout();
}

Node::Node(const Node& orig) {
}

Node::~Node() {
}

void Node::cout(void) {
std::cout << "NODE " << _id << " \"" << _name << "\"" std::endl;
}

int Node::get_id(void) {
return _id;
}

通讯.h

#include "node.h"

class Com {

public:
std::vector<Node> nodes;

Com();
com(const Com& orig);
virtual ~Com();

void cout_nodes(void);

private:

};

通讯.cpp

#include "communication.h"

Com::Com() {
nodes.push_back(Node(169, "Node #1"));
nodes.push_back(Node(170, "Node #2"));
}

Com::Com(const Com& orig) {
}

Com::~Com() {
}

void Com::cout_nodes(void) {
for (uint8_t i = 0; i < nodes.size(); i++) {
nodes[i].cout();
}
}

如果我运行 Com com; 我会得到预期的输出:

[I 171218 13:10:10 Cpp:22] < NODE 169 "Node #1"
[I 171218 13:10:10 Cpp:22] < NODE 170 "Node #2"

但运行 com.cout_nodes(); 结果:

[I 171218 13:10:14 Cpp:22] < NODE 0 ""
[I 171218 13:10:14 Cpp:22] < NODE 0 ""

C++ vector of objects vs. vector of pointers to objects当我使用引用时一切正常,但我无法让 std::iteratorfind_if 正常工作。

更新:工作find_if语句和索引计算

auto iterator = std::find_if(nodes.begin(), nodes.end(), [&](Node node) {
return node.get_id() == 169;
});

if (iterator != nodes.end()) {
size_t index = std::distance(nodes.begin(), iterator );
std::cout << "Index of ID #169: " << index << std::endl;
}

最佳答案

你定义了这个拷贝构造函数:

Node::Node(const Node& orig) {
}

而且它不进行任何复制。它默认初始化正在构造的 Node 的所有成员。因为 std::vector::push_back 复制了它的参数,所以你得到了伪造的拷贝。

而不是强行定义一个编译器可以很容易地自行正确合成的操作(你只有一个 int 和一个 std::string 作为成员),只是不要声明它。

或者,如果您确实想要显式(或需要,例如使用默认 c'tor),只需显式默认它:

class Node {

Node() = default;
Node(const Node& orig) = default;

};

关于C++ 访问类对象 vector 中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47868624/

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