C++访问类对象向量中的元素

MFH*_*MFH 2 c++ class vector object

我正在尝试访问类对象向量中的元素,但我没有把它弄好.我想这是什么毛病构造函数/解构和参考,但即使是其他的问题,如C++的析构函数问题中std ::类对象的矢量,C++类对象指针的向量C++对象与对象指针的向量的向量.希望有人可以帮我修改我的代码片段.

node.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;

};
Run Code Online (Sandbox Code Playgroud)

node.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;
}
Run Code Online (Sandbox Code Playgroud)

communication.h

#include "node.h"

class Com {

public:
    std::vector<Node> nodes;

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

    void cout_nodes(void);

private:

};
Run Code Online (Sandbox Code Playgroud)

communication.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();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我跑,Com com;我得到预期的输出:

[I 171218 13:10:10 Cpp:22] < NODE 169 "Node #1"
[I 171218 13:10:10 Cpp:22] < NODE 170 "Node #2"
Run Code Online (Sandbox Code Playgroud)

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

[I 171218 13:10:14 Cpp:22] < NODE 0 ""
[I 171218 13:10:14 Cpp:22] < NODE 0 ""
Run Code Online (Sandbox Code Playgroud)

就像在C++向量中的对象与指向对象的指针的向量一样,当我使用引用时,一切都很好,但是我无法得到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;
}
Run Code Online (Sandbox Code Playgroud)

Sto*_*ica 8

您定义了此复制构造函数:

Node::Node(const Node& orig) {
}
Run Code Online (Sandbox Code Playgroud)

它没有做任何复制.它默认初始化Node正在构造的所有成员.因为std::vector::push_back它的论点的副本,你的伪造副本.

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

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

class Node {

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

};
Run Code Online (Sandbox Code Playgroud)