我有一个基类,令牌。它没有实现,因此充当标记接口。这是调用者将使用的类型。
{
Token t = startJob(jobId);
// ... (tasks)
// t falls out of scope, destructors are called
}
我有一个派生类 LockToken。它包裹了一个互斥体,并确保在构造过程中获取锁并在销毁过程中释放锁。startJob 方法在某种意义上是工厂方法,它决定是返回 Token(不提供锁定)还是 LockToken(提供锁定)。
Token startJob(int jobId)
{
return (jobId>0) ? LockToken() : Token() ;
}
当 startJob 将返回一个基本实例(一个令牌)时,一切正常。在另一种情况下(jobId>0),将派生实例复制到基本实例。在其他工作中,从 LockToken 复制构造了一个不同的 Token,原始 LockToken 过早地超出范围,释放 startJob 范围内的锁。
我该如何摆脱困境?我可以更改 startJob 以使其返回或输出真正的协变令牌(意味着它可能是 LockToken)?