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

问题描述 投票:0回答:2

我有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)。这种方法很好,但是由于我几乎在所有地方都使用智能指针,然后在这里使用原始指针,因此引入了尴尬(请注意,在我的实际示例中,传递原始指针还会在代码的其他地方产生影响)。

c++ pointers this listener smart-pointers
2个回答
1
投票
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)

0
投票
auto sPointer = std::make_shared<Person>(*this); // problem here? makes a copy?
© www.soinside.com 2019 - 2024. All rights reserved.