【问题标题】:C++ accessing element in vector of class objectsC++ 访问类对象向量中的元素
【发布时间】:2017-12-18 12:33:59
【问题描述】:

我正在尝试访问类对象向量中的一个元素,但我做的不对。我想构造函数/解构函数和引用有问题,但即使是其他问题,如C++ destructor issue with std::vector of class objectsc++ vector of class object pointersC++ vector of objects vs. vector of pointers to objects。希望有人可以帮助我修复我的代码 sn-p。

节点.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;

};

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;
}

通讯.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;
}

【问题讨论】:

    标签: c++ class object vector


    【解决方案1】:

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

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

    而且它不做任何复制。它默认初始化正在构造的Node 的所有成员。由于std::vector::push_back 复制了它的参数,所以你会得到伪造的副本。

    与其强行定义一个编译器可以自行正确合成的操作(您只有一个int 和一个std::string 作为成员),不如不要声明它。

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

    class Node {
    
        Node()                 = default;
        Node(const Node& orig) = default;
    
    };
    

    【讨论】:

      猜你喜欢
      • 2013-09-06
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 2014-12-06
      相关资源
      最近更新 更多