1

因此,有时我希望一个对象具有对共享资源的引用(比如说 type A),或者拥有自己的A.

此外,对象可能会发现自己插入并在容器 ( vector, list, set) 内进行操作。

到目前为止,我所知道的是,unique_ptr如果我有一个要在容器中的多态类型,我将想要使用一个实现。因此,对于HasAnA拥有 an 的类,A能够放置在容器内,同时仍然允许其A' 也是B'(B在这种情况下是 的派生类A),它必须是这样的:

class A {
  virtual void a() { std::cout << "A" << endl; }
  payloadA payload;
}; 
class B: public A {
  void a() { std::cout << "A(B)" << endl; }
  void b() { std::cout << "B" << endl; }
  payloadB payload;
};
class HasAnA {
  std::unique_ptr<A> my_A; // this allows me to build a std::vector<HasAnA>
  OtherStuff my_other_stuff;
};

所以这很好,我正在寻找的是如何实现一个我将调用的类RefersAnA。我希望 aRefersAnA要么拥有自己的 A 的所有权,要么引用其他东西拥有的 A。

让我们来看看。

class RefersAnA {
  std::unique_ptr<A> my_A; // represents my own A: when I die, this A is dealloc'd
  A* not_my_A;             // someone else's A. 
  OtherStuff my_other_stuff;
  RefersAnA () {
    // in here is code that would skip initializing my_A if a valid A* was provided.
  }
};

对我来说,这并不像我想要的那么友好。我可以制作某种模板类来抽象“作为资源的唯一 ptr 或资源的原始 ptr”的概念吗?它需要一位来说明它是两者中的哪一个,以及一个指针。

4

1 回答 1

0

这是一个想法:

struct RefersOrOwns
{
    std::unique_ptr<T> own;
    T & ref;

    RefersOrOwns() : own(new T), ref(*own) { }

    RefersOrOwns(T & t) : ref(t) { }
};

(而不是own(new T)我当然更喜欢own(make_unique<T>()),但这是一个单独的问题。)

于 2012-10-29T22:37:51.750 回答