将包装在智能指针中的问题传递给C ++中的方法的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将包装在智能指针中的问题传递给C ++中的方法的问题相关的知识,希望对你有一定的参考价值。

我有2个相互依赖的类(循环依赖)。一个只是对象Person,另一个只是监听对象PersonListener的更改。 Person类的定义如下。

class Person {
 private:
  std::string name;
  PersonListener listener;
 public:
  Person(std::string name, PersonListener listener) : name{name}, listener{listener} {};
  void setName(std::string name) {
   this->name = name;
   auto sPointer = std::make_shared<Person>(*this); // problem here? makes a copy?
   listener.nameChanged(sPointer); // how do I pass this by reference?
  }
}

PersonListener定义如下。

class PersonListener {
 public:
  PersonListener() {}
  void nameChanged(std::shared_ptr<Person> person) {
    std::cout << "changed" << std::endl;
    // some mutation to person would occur here
    // the way I am passing this of the Person does not allow me to reflect mutations
  }
};

问题在于将this实例的Person传递给PersonListener。当PersonListener更改传入的共享指针时,更改不会反映出来。

我目前的解决方法是使用原始指针将PersonListener.nameChanged重载为void nameChanged(Person *person)。这种方法很好,但是由于我几乎在所有地方都使用智能指针,然后在这里使用原始指针,因此引入了尴尬(请注意,在我的实际示例中,传递原始指针还会在代码的其他地方产生影响)。

答案
auto sPointer = std::make_shared<Person>(*this); // problem here? makes a copy?

是,是。

考虑使用很诱人

listener.nameChanged(std::shared_ptr<Person>(this));

但是,this成为shared_ptr的管理对象,这是不正确的。

我看不出您无法使用的任何原因

class PersonListener {
    ...
    void nameChanged(Person& person) { ... }
};

并使用]进行调用>

listener.nameChanged(*this)
另一答案
auto sPointer = std::make_shared<Person>(*this); // problem here? makes a copy?

以上是关于将包装在智能指针中的问题传递给C ++中的方法的问题的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中创建对象并将指针传递给 python

如何将指向 C# 结构的指针传递给 C 中的方法

C ++将向量传递给函数:引用与指针,哪个是首选? [复制]

如何将 C# 中的方法指针传递给 C 库?

C++ 中的高效循环缓冲区,将传递给 C 风格的数组函数参数

将指针向量传递给c ++中的函数[重复]