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 任务的私有成员。
因为 Task
是 Scheduler
的基数 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 的默认构造函数是私有的,所以 ...
我的主classTask
有一个私人会员:
private:
Task();
我用 class Task
:
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 任务的私有成员。
因为 Task
是 Scheduler
的基数 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 的默认构造函数是私有的,所以 ...