【发布时间】:2021-08-24 15:23:40
【问题描述】:
我想在类继承情况下替换传统的裸指针用法。
我的意思的例子:
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
class Base
{
public:
void doBaseStuff ()
{
cout << "base stuff\n";
}
};
class Derived:public Base
{
public:
void doDerivedStuff ()
{
cout << "derived stuff\n";
}
};
int main ()
{
// vector to hold pointers
vector < Base * >baseCollection;
// generate pointers
Derived *derivedPtr = new Derived;
Base* basePtr = new Base;
// use derived pointer for something
derivedPtr->doDerivedStuff ();
// fill vector with pointers
baseCollection.push_back (basePtr);
baseCollection.push_back (derivedPtr);
// iterate some 'interface' method
for (auto & element:baseCollection)
{
element->doBaseStuff ();
}
return 0;
}
如下所示的重构方法是否正确?我使用 C++17。 std::unique_ptr 而不是 std::shared_ptr 在这种情况下不会编译(行:baseCollection.push_back(derivedPtr);)。
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
// sample classes
class Base
{
public:
void doBaseStuff ()
{
cout << "base stuff\n";
}
};
class Derived:public Base
{
public:
void doDerivedStuff ()
{
cout << "derived stuff\n";
}
};
int main ()
{
// vector to hold pointers
vector<shared_ptr<Base>> baseCollection;
// generate pointers
shared_ptr<Base> basePtr = make_shared<Base>();
shared_ptr<Derived> derivedPtr = make_shared<Derived>();
// use derived pointer for something
derivedPtr->doDerivedStuff();
// fill vector with pointers
baseCollection.push_back(basePtr);
baseCollection.push_back(derivedPtr); // implicit cast from shared_ptr<Derived> to shared_ptr<Base> !?
// iterate some 'interface' method
for(auto& element : baseCollection)
{
element->doBaseStuff();
}
return 0;
}
正如预期的那样,两种情况下的输出如下:
derived stuff
base stuff
base stuff
【问题讨论】:
-
baseCollection.push_back( std::move(derivedPtr) );将允许derivedPtr成为std::unique_ptr。 [意见警告]std::shared_ptr往往速度较慢,并且往往使代码更难推理。std::unique_ptr应该是你可以使用的首选。 -
@DrewDormann 据我了解,unique_ptr 会阻止自身被复制,因此可以保证存在指向同一对象的“被遗忘”指针......
-
这样可以保证“被遗忘”的指向同一个对象的指针存在我不确定你在这里的意思。使用 unique_ptr 表示所有权,使用裸指针表示非所有权。
-
@Eljay 所有权概念是实际上是我的意思。谢谢!
标签: c++ smart-pointers