gpt4 book ai didi

c++ - 避免对象切片和使用 shared_ptr

转载 作者:行者123 更新时间:2023-11-30 05:41:43 26 4
gpt4 key购买 nike

现在我正在开发一个搜索节点程序。我的代码在下面,我实际上想搜索特定的子节点。为了避免对象切片,我使用了一个指针,但指针可能是 null_ptr。那么我应该如何避免这个问题。我不确定它的问题?并且为了避免 new instance 属性,main() 中的 Parent obj 实例应该声明为 shared_ptr supported since c++11?

#include <iostream>

using namespace std;

class Parent {
public:
Parent() { name = "Parent"; }
virtual void print() {
cout << "Parent::print()" << endl;
}

string name;
};

class Child1 : public Parent {
public:
Child1() { name = "Child1"; }
virtual void print() override{
cout << "Child1::print()" << endl;
}
};

class Child2 : public Parent {
public:
Child2() { name = "Child2"; }
virtual void print() override{
cout << "Child2::print()" << endl;
}
};

class Manager {
public:
void getChild(int i, Parent* obj) {
if(i==0) {
cout << "sest child1" << endl;
obj = (&child1);
} else {
cout << "sest child2" << endl;
obj = (&child2);
}
}
Child1 child1;
Child2 child2;
};

int main()
{
// object slicing?
// Parent obj;
// Manager manager;
// manager.getChild(1, obj);
// obj.print();

Parent* obj;
Manager manager;
manager.getChild(1, obj);
obj->print();

}

由于段错误,我的代码被破坏了。

  $ a.out D
sest child2
[1] 5457 segmentation fault ./work/derived/a.out D

最佳答案

void getChild(int i, Parent* obj)

这个函数签名告诉我们该函数接受一个整数和指向一个对象的指针。两者都是按值传递:

如果你有一个对象,比如在地址 42,那么你可以有效地将数字 42 作为第二个参数传递。

在函数内部,参数充当变量,并且由于在这种情况下它们不是常量,因此您可以修改它们。所以当你写的时候

obj = &child1;

你只是改变了一个局部变量的状态,比如从前面提到的 42 到其他地址,例如24. 这些都不会影响调用者作为第二个参数给出的指针。

您想要实现的是拥有一个“out”参数。为此,您需要一个指向您想要更改的内容的指针。在你的情况下你想改变一个指针,所以你需要一个指向指针的指针:

void getChild(int i, Parent * * obj_ptr)

要将它设置为一个值,您需要取消引用它:

*obj_ptr = &child1;

但是在这种情况下我不会使用 out 参数,因为您可以从函数返回一个值,所以只需返回指针:

Parent* getChild(int i) {
// ...
return &child1;
}
// in main
Parent* node = manager.getChild(1);

关于std::shared_ptr:您应该考虑谁拥有您的指针指向的实例。也就是说,谁负责销毁它们并释放关联的内存。在您的情况下,子实例是管理器实例的一部分。所以管理器实例拥有它们并将照顾它们。 shared_ptr 适用于(希望)极少数情况,当您不确切知道实例需要多长时间时。因此,您共享所有权,让最后的所有者负责销毁和释放。

我并不完全清楚您在这里实际需要什么样的所有权。你想要某种遍历,即 child 实例是其他 child 的 parent (或您术语中的管理者)吗?或者您只需要访问成员?那么除了引用我根本不会使用指针。

关于c++ - 避免对象切片和使用 shared_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31041433/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com