在构造函数中使用关键字“this”时定义复制构造函数

拉维·乔希

我在定义我的类的复制构造函数时遇到了困难TextListener该类使用关键字TextListener绑定方法请看下面的完整代码:callbackthis

#include <iostream>
#include <ros/ros.h>
#include <std_msgs/String.h>

class TextListener {
 private:
  std::string _text;
  ros::Subscriber _subscriber;

 public:
  TextListener() {
    std::cout << "[" << this << "] deafult constructor called" << std::endl;
  }

  TextListener(const TextListener &other)
      : _subscriber(other._subscriber), _text(other._text) {
    std::cout << "[" << this << "] copy constructor called" << std::endl;
  }

  TextListener &operator=(const TextListener &other) {
    std::cout << "[" << this << "] copy assignment called" << std::endl;
    _subscriber = other._subscriber;
    _text = other._text;
    return *this;
  }

  TextListener(ros::NodeHandle &nh, const std::string &topicName) {
    std::cout << "[" << this << "] constructor called" << std::endl;
    _subscriber = nh.subscribe(topicName, 1, &TextListener::callback, this);
  }

  void callback(const std_msgs::String::ConstPtr &msg) { _text = msg->data; }

  std::string &getText() { return _text; }

  ~TextListener() {
    std::cout << "[" << this << "] destructor called" << std::endl;
  }
};

为了测试上面的类,我创建了它的一个实例,它可以正常工作。但是,当我创建一个新实例并将此实例分配给新实例时,新实例不起作用。下面是代码片段:

int main(int argc, char **argv) {
  ros::init(argc, argv, "tet_listener");

  ros::NodeHandle nh;
  std::string topicName = "chatter";
  TextListener listener(nh, topicName);
  TextListener copyListener = listener;

  ros::Rate loop_rate(1);
  while (ros::ok()) {
    ROS_INFO("I heard: [%s]", copyListener.getText().c_str());
    ros::spinOnce();
    loop_rate.sleep();
  }

  return 0;
}

该方法getText()没有任何价值。请参阅下面的输出:

[0x7ffc5698a2b0] constructor called
[0x7ffc5698a2d0] copy constructor called
[ INFO] [1549031938.250136695]: I heard: []
[ INFO] [1549031939.250183378]: I heard: []
[ INFO] [1549031940.250170333]: I heard: []
[ INFO] [1549031941.250176834]: I heard: []
^C[0x7ffc5698a2d0] destructor called
[0x7ffc5698a2b0] destructor called

我猜复制构造函数丢失了一些东西。在构造函数中使用关键字“this”时如何定义复制构造函数?

安德鲁·麦吉尼斯

您需要两个Subscribers,一个通知原始 TextListener 对象,另一个通知复制 TextListener

您实际上有两个订阅者,但由于副本 TextListener 中的一个是原始订阅者的副本,因此它们都更新了原始 TextListener 的 _text 成员。

我想不出比在 TextListener 中保留对 NodeHandle 的引用并让复制构造函数重新订阅 NodeHandle 而不是复制原始对象的订阅(即调用原始对象的回调)更好的方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在类中使用关键字this与多个构造函数

来自分类Dev

为什么在构造函数中使用此关键字

来自分类Dev

g ++中的'explicit'关键字对简单构造函数(不是复制/赋值构造函数)无效吗?

来自分类Dev

perl构造函数关键字“ new”

来自分类Dev

使用'using'关键字公开继承的构造函数

来自分类Dev

使用关键字this的构造函数中的段错误

来自分类Dev

在类中使用构造函数的打字稿不允许使用 new 关键字

来自分类Dev

在结构构造函数中使用“ this”关键字编译错误?-C ++

来自分类Dev

在Ruby类构造函数中使用关键字参数还是哈希参数?

来自分类Dev

在一个类中使用关键字this与多个构造函数

来自分类Dev

JavaScript-函数构造函数无需使用'new'关键字即可工作

来自分类Dev

构造函数之后“ this”关键字的用途是什么?

来自分类Dev

构造函数外部的C#基本关键字

来自分类Dev

参数类型的构造函数中“ where”关键字的用途

来自分类Dev

带有扩展关键字的Java构造函数

来自分类Dev

打字稿中的关键字构造函数?

来自分类Dev

使用多个参数的构造函数是否需要显式关键字?

来自分类Dev

派生类构造函数何时被迫使用base关键字?

来自分类Dev

C++:使用关键字运算符重载成员的构造函数

来自分类Dev

这段代码中如何使用super关键字来调用父类的构造函数?

来自分类Dev

在构造函数中使用“ this”

来自分类Dev

构造函数使用1个参数,但基本关键字使用2个参数时会发生什么情况

来自分类Dev

构造函数使用1个参数,但基本关键字使用2个参数时会发生什么情况

来自分类Dev

在用户定义的函数中使用 &body Lambda List 关键字

来自分类Dev

编译器在调用基类构造函数之前会在子类构造函数中寻找** super **关键字吗?

来自分类Dev

为什么构建器模式的构造函数是私有的,但为什么仍使用new关键字?

来自分类Dev

是否建议在函数中使用using关键字?

来自分类Dev

在函数中使用此关键字设置属性

来自分类Dev

类型错误:在函数中使用“ this”关键字的“ Not a function”

Related 相关文章

  1. 1

    在类中使用关键字this与多个构造函数

  2. 2

    为什么在构造函数中使用此关键字

  3. 3

    g ++中的'explicit'关键字对简单构造函数(不是复制/赋值构造函数)无效吗?

  4. 4

    perl构造函数关键字“ new”

  5. 5

    使用'using'关键字公开继承的构造函数

  6. 6

    使用关键字this的构造函数中的段错误

  7. 7

    在类中使用构造函数的打字稿不允许使用 new 关键字

  8. 8

    在结构构造函数中使用“ this”关键字编译错误?-C ++

  9. 9

    在Ruby类构造函数中使用关键字参数还是哈希参数?

  10. 10

    在一个类中使用关键字this与多个构造函数

  11. 11

    JavaScript-函数构造函数无需使用'new'关键字即可工作

  12. 12

    构造函数之后“ this”关键字的用途是什么?

  13. 13

    构造函数外部的C#基本关键字

  14. 14

    参数类型的构造函数中“ where”关键字的用途

  15. 15

    带有扩展关键字的Java构造函数

  16. 16

    打字稿中的关键字构造函数?

  17. 17

    使用多个参数的构造函数是否需要显式关键字?

  18. 18

    派生类构造函数何时被迫使用base关键字?

  19. 19

    C++:使用关键字运算符重载成员的构造函数

  20. 20

    这段代码中如何使用super关键字来调用父类的构造函数?

  21. 21

    在构造函数中使用“ this”

  22. 22

    构造函数使用1个参数,但基本关键字使用2个参数时会发生什么情况

  23. 23

    构造函数使用1个参数,但基本关键字使用2个参数时会发生什么情况

  24. 24

    在用户定义的函数中使用 &body Lambda List 关键字

  25. 25

    编译器在调用基类构造函数之前会在子类构造函数中寻找** super **关键字吗?

  26. 26

    为什么构建器模式的构造函数是私有的,但为什么仍使用new关键字?

  27. 27

    是否建议在函数中使用using关键字?

  28. 28

    在函数中使用此关键字设置属性

  29. 29

    类型错误:在函数中使用“ this”关键字的“ Not a function”

热门标签

归档