【问题标题】:Friend parent class cannot access private constructor in child [closed]朋友父类无法访问子类中的私有构造函数[关闭]
【发布时间】:2014-07-31 03:09:03
【问题描述】:

我想创建一个父类Base,它的子类Derived1Derived2 等都有工厂。Base 的构造函数及其所有派生类都应该是私有的。我尝试这样做:

base.h:

class Derived1;    

class Base
{
    protected:
        Base ();

    public:
        Base *createDerived1 ();
}

#include "derived1.h"

派生1.h:

#include "base.h"    

class Derived1 : public Base
{
    friend class Base;

    private:
        Derived1 ();
}

派生1.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 类的构造函数?

【问题讨论】:

    标签: c++ inheritance friend


    【解决方案1】:

    以下代码对我有用:

    //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;
    }
    

    您的一个错误已被另一个回复识别。另一个是工厂方法应该是static,因为你不能创建Base对象,因为它有private构造函数。

    【讨论】:

    • 对,但实际上我的代码中的“基础”构造函数是“受保护的”,我错误地将其发布为“私有”。已修复,谢谢。
    • @AntonPoznyakovskiy,请检查更新的答案。
    • 但是我声明 Base 是 Derived 的朋友,它应该提供对 Derived 的所有元素到 Base 的访问权限,不是吗?
    • 不,实际上,工厂方法确实可以在没有静态的情况下工作,但你是对的,因为它应该是静态的。
    • @AntonPoznyakovskiy,我不明白,如果你不能创建任何对象,你将如何调用类的 non-static 方法?你能澄清一下吗?
    【解决方案2】:

    这确实是我的一个愚蠢的错误,我写道:

    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
    }
    

    当然,不能从全局范围访问私有构造函数。

    【讨论】:

      猜你喜欢
      • 2022-07-22
      • 2013-05-21
      • 2021-08-16
      • 2013-06-30
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多