1

这就是我所拥有的:

class A{
    B* object;
    const B& create_object(){
        if(object == nullptr)
            object = new B(this);
        return *object;
    }
}

现在,事情就是这样。我应该不允许以 A 以外的任何其他方式创建 B。允许我创建 B 对象的唯一方法是:

A a;
auto b1 = a.create_object();

现在因为我不应该允许创建对象,所以我将 B 的所有构造函数设为私有,并说 A 是 B 的朋友。但是在做的时候

auto b1 = a.create_object();

它不会在调用复制构造函数时编译。有什么办法可以避免吗?我不想返回一个指针,它需要是一个对象。

4

2 回答 2

6

b1将被推断为B,而不是const B&,因此编译器将检查 copy-ctor 是否可用,const auto&用于这种情况

A a;
const auto& b1 = a.create_object();
于 2013-11-08T13:15:31.920 回答
0

你可以用代理对象做你想做的事:

class source_of_B
{
  class B &source;
  source_of_B(B &source): source(source) {}
  friend class A;
  friend class B;
};

因为它没有公共构造函数,所以此类对象的创建仅限于其朋友。因此,您可以将公共构造函数添加到接受代理的 B 中,而不会影响您在受控位置创建 B 的要求:

class B
{
  int x;
  B(int x): x(x) {}
  friend class A;
public:
  B(const source_of_B &arg): x(arg.source.x) {}
};
class A
{
  B b;
public:
  A(): b(5) {}
  source_of_B create_object() { return source_of_B(b); }
};

int main()
{
  A a;
  B b = a.create_object();
}

但是您不能再使用auto b = a.create_object();此方法。

编辑

如果你的编译器支持返回值优化,它可能支持,你可以不用代理。改成直接create_object()return就好了B

  B create_object() { return b; }

  auto b2 = a.create_object();

复制构造函数将自行调用create_object()。唯一的问题是某些(较旧的)编译器对函数的复杂性有限制。例如,参见维基百科文章。工作示例位于http://ideone.com/w1jKAd

于 2013-11-08T14:51:18.100 回答