Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;工厂无法从父级访问子构造函数_C++_Inheritance_Factory - Fatal编程技术网

C++ c++;工厂无法从父级访问子构造函数

C++ c++;工厂无法从父级访问子构造函数,c++,inheritance,factory,C++,Inheritance,Factory,我在做插座工厂。我希望每个外部应用程序都使用Socket类的接口,Socket类是几个类(ServerSocketTCP、ClientSocketTCP、ServerSocketUDP等)的父类,因为最终Socket将用于独立于类型的读写,从而简化了它们的使用。因此,套接字将仅由套接字静态成员(工厂)构造。这就是为什么要保护子构造函数以避免用户创建它们 这里是我得到错误的地方: class A{ protected: A(); public: static A* createClas

我在做插座工厂。我希望每个外部应用程序都使用Socket类的接口,Socket类是几个类(ServerSocketTCP、ClientSocketTCP、ServerSocketUDP等)的父类,因为最终Socket将用于独立于类型的读写,从而简化了它们的使用。因此,套接字将仅由套接字静态成员(工厂)构造。这就是为什么要保护子构造函数以避免用户创建它们

这里是我得到错误的地方:

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是可访问性问题