首页 > 解决方案 > 通过引用接收的习语和私有构造函数不兼容?

问题描述

我有Some课和Factory这个课。 Factory是 的朋友Some, 的构造函数Some是私有的。Some我这样做是因为我希望每个人都可以创建仅 via的新实例Factory

像这样的东西:

class Some {
    friend class Factory;
    Some(..) {}
public:
    Some& operator=(const Some& s) {...}
};

class Factory {
public:
    Some makeSome(...) {
    ...
        return Some(...);
    };
};

好的,这行得通。另一方面,我有一些队列包装器(出于同步原因包装)。它用成语写道“每个方法都必须返回错误代码。结果仅通过参数引用传递”

就像是:

template <class T>
class SyncQueue {
queue<t> m_q;
mutex m_m;
public:
....
    int Pop(T &t) {
        lock_guard<mutex> lock(m_m);
        if (m_q.empty())
           return 1;
        t = m_q.fromt();
        m_q.pop();
        return 0;
    }
};

据我了解,我不能用它SyncQueue来拉Some,对吗?

因为这样的代码:

Some s;
if (queue(s)) {
   ...
}

必需的空构造函数Some。我有下一个选择:

  1. public为_Some
  2. 制作private空的构造函数并添加新friendSome
  3. 使用指针

Some有一些在构造过程中必须初始化的 const 成员(并且只Factory知道这个值)。施工也是Some繁重的作业;

所以这三个选项都很糟糕:

  1. 公共构造函数破坏了关于工厂的想法。
  2. 很多朋友都不是个好主意。
  3. 指针需要重写很多代码。使用它也是一个很大的痛苦。

我错过了什么,或者没有办法按照我的意愿工作?

标签: c++constructorpass-by-referencefactoryfriend

解决方案


推荐阅读