C++ c++;工厂无法从父级访问子构造函数
我在做插座工厂。我希望每个外部应用程序都使用Socket类的接口,Socket类是几个类(ServerSocketTCP、ClientSocketTCP、ServerSocketUDP等)的父类,因为最终Socket将用于独立于类型的读写,从而简化了它们的使用。因此,套接字将仅由套接字静态成员(工厂)构造。这就是为什么要保护子构造函数以避免用户创建它们 这里是我得到错误的地方:C++ c++;工厂无法从父级访问子构造函数,c++,inheritance,factory,C++,Inheritance,Factory,我在做插座工厂。我希望每个外部应用程序都使用Socket类的接口,Socket类是几个类(ServerSocketTCP、ClientSocketTCP、ServerSocketUDP等)的父类,因为最终Socket将用于独立于类型的读写,从而简化了它们的使用。因此,套接字将仅由套接字静态成员(工厂)构造。这就是为什么要保护子构造函数以避免用户创建它们 这里是我得到错误的地方: class A{ protected: A(); public: static A* createClas
class A{
protected:
A();
public:
static A* createClass(int _type){
switch(_type){
case 0:
return new B();
case 1:
return new C();
default:
return nullptr;
}
}
}
class B: public A{
protected:
B();
}
class C: public A{
protected:
C();
}
然后编译器说B和C的构造函数不能从A访问。有什么方法可以实现我想要的吗?我原以为可以访问受儿童保护的成员,但现在我发现这并不是因为访问继承…在您给出的代码中,工厂方法甚至看不到B和C类定义,所以它不可能使用它们,无论父级是否可以访问儿童的受保护成员(正如马可A.所指出的那样,这是不可能的。)
您需要将工厂方法的实现移动到一个cpp文件中,在该文件中可以看到所有的类定义。然后,您将得到有关受保护的构造函数的错误,并且您可以适当地处理这些错误(可能是通过交朋友)
您需要将工厂方法的实现移动到一个cpp文件中,在该文件中可以看到所有的类定义。然后,您将得到有关受保护的构造函数的错误,并且您可以适当地处理这些错误(可能是通过交朋友)是的,编译器正在抱怨,因为B和C构造函数和`受保护,不存在友谊。所以A不能调用这些构造函数
正确的设计是将工厂类型与类层次结构分离,而不是将其放在基类中。是的,编译器正在抱怨,因为B和C构造函数和`受保护,不存在友谊。因此A无法调用这些构造函数
正确的设计是将工厂类型与类层次结构分离,而不是将其放在基类中。您的代码存在问题。除了类定义后缺少
;
之外,您还以错误的方式实现了工厂
一般来说,您有一个生产产品的生产商。这些产品都共享一个普通用户无法实例化的基类(例如,纯虚拟或受保护的ctor)。根据客户的选择,生产商创建产品实例并将其返回。因此,如果您的产品目录是私有的
,则需要将生产商声明为朋友
,以便能够访问相应的目录
现在,生产者提供了一些指向基本产品的指针,这些基本产品可以向下转换为您需要的类型。因此,编译示例(选择您的并相应地修改)如下所示:
class Producer;
class BaseProduct {
protected:
BaseProduct() {}
};
class Product_B : public BaseProduct {
friend class Producer;
private:
Product_B();
};
class Product_C : public BaseProduct {
friend class Producer;
private:
Product_C();
};
class Producer{
private:
Producer();
public:
static BaseProduct* createProduct_Class(int _type){
switch(_type){
case 0:
return new Product_B;
case 1:
return new Product_C;
default:
return nullptr;
}
}
};
请注意,错误使用factory模式可能会很快导致反模式
编辑:另外,你不应该忘记扩展producer类来管理删除等。有许多书籍和网站可以处理各种模式。其中一本好书是《Bernd Brügge的面向对象软件工程》,但当然还有很多。您的代码存在问题。除了类定义后缺少
;
之外,您还以错误的方式实现了工厂
一般来说,您有一个生产产品的生产商。这些产品都共享一个普通用户无法实例化的基类(例如,纯虚拟或受保护的ctor)。根据客户的选择,生产商创建产品实例并将其返回。因此,如果您的产品目录是私有的
,则需要将生产商声明为朋友
,以便能够访问相应的目录
现在,生产者提供了一些指向基本产品的指针,这些基本产品可以向下转换为您需要的类型。因此,编译示例(选择您的并相应地修改)如下所示:
class Producer;
class BaseProduct {
protected:
BaseProduct() {}
};
class Product_B : public BaseProduct {
friend class Producer;
private:
Product_B();
};
class Product_C : public BaseProduct {
friend class Producer;
private:
Product_C();
};
class Producer{
private:
Producer();
public:
static BaseProduct* createProduct_Class(int _type){
switch(_type){
case 0:
return new Product_B;
case 1:
return new Product_C;
default:
return nullptr;
}
}
};
请注意,错误使用factory模式可能会很快导致反模式
编辑:另外,你不应该忘记扩展producer类来管理删除等。有许多书籍和网站可以处理各种模式。其中一本好书是《Bernd Brügge的面向对象软件工程》,但当然还有很多。注意不要偏离主题工厂模式设计的问题:你可以描述和建议一个更好的方法,但主要问题是可访问性问题注意不要偏离主题工厂模式设计的问题:你可以描述和建议一个更好的方法,但主要问题是em是可访问性问题