C++ 错误编译,因为私有成员

C++ error compilation because private member

我的主classTask有一个私人会员:

private:
    Task();

我用 class Task:

添加一个派生 class Scheduler
class Scheduler : public Task {
    friend class Task;`

我创建了一个文件Scheduler.cc来实现class派生Scheduler:

的构造函数
Scheduler::Scheduler() {
    //nothing here.
}

我尝试使用空白的构造函数 Scheduler 进行编译,但我收到一个编译错误,我不理解其中的关系,因为我的构造函数 Scheduler 是空白的:

/tmp/PROJETO/T1/booos-t1/lib/Task.h: In constructor ‘BOOOS::Scheduler::Scheduler()’: /tmp/PROJETO/T1/booos-t1/lib/Task.h:41:2: error: ‘BOOOS::Task::Task()’ is private Scheduler.cc:13:22: error: within this context make[1]: ** [Scheduler.o] Erro 1

我想了解我的问题,因为我没有尝试在我的 Scheduler 构造函数中访问 class 任务的私有成员。

因为 TaskScheduler 的基数 class,

Scheduler::Scheduler() {
  //nothing here.
}

相当于

Scheduler::Scheduler() : Task() {
  //nothing here.
}

由于 Task::Task() 是私有的,编译器无法处理该代码。

您可以将 Task 的默认构造函数放在 protected 部分以消除此错误。这样,客户端无法使用默认构造函数创建 Task 的实例,但 Task 的子 class 可以使用其默认构造函数。

protected:
      Task();

Task() 不是 private member,而是 private default constructor

您的派生 class 无法访问您的 private 默认构造函数。您需要使其成为 protected,或者,如果您有另一个可用的构造函数,请使用这个:

class Task
{
public:
    Task( int i );

private:
    Task();
};

Scheduler::Scheduler()
{ // does not compile, equivalent to the next one
}

Scheduler::Scheduler() : Task() 
{ // does not compile
}

Scheduler::Scheduler() : Task(3) 
{ // does compile!
}

因为构造函数总是调用父构造函数 class。显式地通过初始化列表,或隐式地通过默认构造函数。 这里父 class 的默认构造函数是私有的,所以 ...