gpt4 book ai didi

C++ 工厂。子构造函数不能从父访问

转载 作者:行者123 更新时间:2023-11-30 01:52:49 26 4
gpt4 key购买 nike

我正在制作一个套接字工厂。我希望每个外部应用程序都使用 Socket 类的接口(interface),它是几个类(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 访问。有什么办法可以做我想做的事吗?我认为可以访问 protected child 成员,但现在我发现这不是因为访问继承......

最佳答案

您的代码有问题。除了在类定义之后缺少 ; 之外,您还以错误的方式实现了工厂。

一般来说,您有一个生产产品的生产者。这些产品都共享一个普通用户不应实例化的基类(例如纯虚拟或 protected ctor)。根据客户的选择,生产者创建产品实例并将其返回。因此,如果您的产品 ctors 是 private,您需要将生产者声明为 friend,以便能够访问相应的 ctors。

现在,生产者提供了一些指向基础产品的指针,该基础产品可以向下转型为您需要的类型。所以一个编译示例(选择你的并相应地修改它)将如下所示:

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

请注意,错误地使用工厂模式会很快导致反模式。

编辑:此外,您不应忘记扩展生产者类以管理删除等。有许多书籍和网站可以处理各种模式。一本好书是“Bernd Brügge 的面向对象的软件工程”,但当然还有更多。

关于C++ 工厂。子构造函数不能从父访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23973403/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com