2014-06-10 29 views
0

我要创造出有工厂,它的子类Derived1Derived2Base及其所有派生类应该是私有的构造一个父类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类的构造函数公开吗?

回答

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对象,因为它具有私人构造函数。

+0

对,但实际上我的代码中的'Base'构造函数是'protected',我把它错误地发布为'private'。修正了,谢谢。 –

+0

@AntonPoznyakovskiy,PLZ检查更新的答案。 – Rakib

+0

但是我声明Base是Derived的一个朋友,它应该提供对Derived to Base的所有元素的访问,不是吗? –

0

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

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 
} 

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