将包装在智能指针中的问题传递给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 ++将向量传递给函数:引用与指针,哪个是首选? [复制]