var*_*ard 7 c++ inheritance smart-pointers multiple-inheritance
我有一个继承两个接口的类:
class Multi : public IFoo, public IBar {
public:
virtual ~Multi();
// Foo part
virtual void fooMethod();
// ...
// Bar part
virtual void barMethod();
// ...
};
Run Code Online (Sandbox Code Playgroud)
不幸的是,这个类不能在每个接口的两个单独的类中分解.事实上,在类实现中,这些实体(Foo和Bar)紧密耦合,但将来它们可能会分开.
另一个类想要使用Multi类,有一个指向IFoo和IBar的指针:
class ClientClass {
public:
ClientClass(); // constructor
// smth
private:
std::shared_ptr<IFoo> foo_;
std::shared_ptr<IBar> bar_;
};
Run Code Online (Sandbox Code Playgroud)
在构造函数中,我做了类似的事情:
ClientClass::ClientClass(){
auto pMulti = new Multi;
foo_ = std::shared_ptr<IFoo>(pMulti);
bar_= std::shared_ptr<IBar>(pMulti);
}
Run Code Online (Sandbox Code Playgroud)
但是每个共享指针都有单独的引用计数器,它会导致在类破坏时删除已经删除的指针,对不对?
ClientClass::ClientClass()
{
auto pMulti = std::make_shared<Multi>();
foo_ = pMulti;
bar_ = pMulti;
}
Run Code Online (Sandbox Code Playgroud)
将确保他们有相同的参考计数器.你可以自己看看:
#include <iostream>
#include <memory>
class Base1{};
class Base2{};
class Derived : public Base1, public Base2 {};
int main()
{
auto derived = std::make_shared<Derived>();
std::shared_ptr<Base1> base1 = derived;
std::shared_ptr<Base2> base2 = derived;
std::cout << "base1 usecount = " << base1.use_count() << '\n';
std::cout << "base2 usecount = " << base2.use_count() << '\n';
std::cout << "derived usecount = " << derived.use_count() << '\n';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
生产:
base1 usecount = 3
base2 usecount = 3
derived usecount = 3
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3036 次 |
| 最近记录: |