好友父类不能访问子类中的私有构造函数
Friend parent class cannot access private constructor in child
我想创建一个父类Base
,它的子类Derived1
, Derived2
等有工厂。Base
及其所有派生类的构造函数应该是私有的。我试着这样做:
base.h:
class Derived1;
class Base
{
protected:
Base ();
public:
Base *createDerived1 ();
}
#include "derived1.h"
derived1.h:
#include "base.h"
class Derived1 : public Base
{
friend class Base;
private:
Derived1 ();
}
derived1.cpp:
Derived1::Derived1 ()
: Base ()
{
}
base.cpp:
Base *Base::createDerived1 ()
{
return new Derived1 (); // error C2248: 'Derived1::Derived1' : cannot access private member declared in class 'Derived1'
}
然而,我不能访问工厂内部的私有构造函数,尽管将Base
声明为Derived1
的友类。我做错了什么,或者没有可能有父类作为朋友,我应该使Derived
类的构造函数公开?
下面的代码为我工作:
//B.h
class D;
class B{
protected:
B(){}
public:
static B* f();
};
//D.h
class D: public B{
friend class B;
private:
D():B(){}
};
//B.cpp
B* B::f(){
D *d=new D;
return d;
}
你的一个bug是由另一个回复确定的。另一个是工厂方法应该是static
,因为您将无法创建Base
对象,因为它具有私有构造函数。
这确实是我的一个愚蠢的错误,我写道:
Base *createDerived1 ()
{
return new Derived1 (); // error C2248: 'Derived1::Derived1' : cannot access private member declared in class 'Derived1'
}
不是Base *Base::createDerived1 ()
{
return new Derived1 (); // everything fine
}
当然,私有构造函数不能从全局作用域访问。
相关文章:
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 参数包构造函数在类模板中隐藏用户定义的转换
- 具有已删除移动和复制构造函数的类的就地构造
- 创建一个没有复制构造函数的类的 std::vector 的 std::vector
- C++构造函数和类?
- 在 C++ 中,默认情况下构造函数为类的数据成员提供的值是多少?
- 如何在其他类中使用参数化构造函数制作类的对象?
- 具有值包装器的可变参数模板构造函数的类构造函数优先级
- 如何使用私有构造函数对类进行单元测试?
- c++17在编译时将带有已删除复制构造函数的类添加到std::vector
- 从作为模板参数传递给构造函数的类继承,或者从它们继承
- 继承的构造函数忽略类内初始化
- 模板和隐式构造函数的类定义之外的友元声明
- 具有字符串文本构造函数的类不适用于 const 引用初始化
- C++ - 从另一个类构造函数调用类构造函数
- 定义结构中没有默认构造函数的类
- 我可以将 std::move 与不提供 move 构造函数的类一起使用吗?
- 是否可以默认初始化具有已删除默认构造函数的类类型
- C++具有移动和复制构造函数的类中的代码重复
- 没有默认构造函数的类对象的值初始化