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

C++ error compilation because private member

本文关键字:成员 因为 编译 错误 C++      更新时间:2023-10-16

我的主类Task有一个私有成员:

private:
    Task();

我添加了一个派生类Scheduler和类Task:

class Scheduler : public Task {
    friend class Task;`

我创建了一个文件Scheduler.cc来实现类派生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构造函数中类Task的私有成员。

由于TaskScheduler的基类,

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

相当于

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

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

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

protected:
      Task();

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

派生类无法访问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!
}
因为构造函数总是调用父类的构造函数。显式地通过初始化列表,或者隐式地通过默认构造函数。这里父类的默认构造函数是私有的,所以。。。