我正在尝试访问类对象向量中的元素,但我没有把它弄好。我想构造函数/解构函数和引用有问题,但其他问题甚至是C++ destructor issue with std::vector of class objects,c++ vector of class object pointers或C++ vector of objects vs. vector of pointers to objects。希望有人可以帮我修改我的代码片段。
ContentResolver
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;
};
#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;
}
#include "node.h"
class Com {
public:
std::vector<Node> nodes;
Com();
com(const Com& orig);
virtual ~Com();
void cout_nodes(void);
private:
};
如果我运行#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();
与C++ vector of objects vs. vector of pointers to objects一样,当我使用引用时一切正常但我无法使[I 171218 13:10:14 Cpp:22] < NODE 0 ""
[I 171218 13:10:14 Cpp:22] < NODE 0 ""
和std::iterator
工作。
find_if
语句和索引计算find_if
答案 0 :(得分:8)
您定义了此复制构造函数:
Node::Node(const Node& orig) {
}
它没有做任何复制。它默认初始化正在构造的Node
的所有成员。由于std::vector::push_back
会复制其参数,因此您的伪造副本会复制。
而不是强制定义编译器可以自己正确地合成的操作(您只有int
和std::string
作为成员),而不是声明它。
或者,如果您确实想要显式(或需要,例如使用默认的c'tor),只需明确默认它:
class Node {
Node() = default;
Node(const Node& orig) = default;
};