gpt4 book ai didi

c++ - 防止公共(public)使用用作私有(private)基类的类

转载 作者:行者123 更新时间:2023-11-30 00:44:41 25 4
gpt4 key购买 nike

如何确保只有“我的”代码可以使用一个类,即使它使用的是类? (如果它不用作基类,我可以使它成为我的一个类的 privateprotected 嵌套类)

如果我想表明对我的一个类使用基类只是一个实现细节,我可以使用私有(private)基类:

 class Base
{
...
}

class Derived: private Base
{
public:

Derived(...): Base{...} {... };

...
}

对于我的 Derived 类的客户,我使用了 Base 类并不明显:

 #include "Derived.h"

void client() {
Derived d{...};
Base *b = static_cast< Base * >(&d);// error
...
}

但是想象一下 Base 类是如此特化、令人困惑或难以使用,以至于我不希望我的代码的客户可以将它用作基类或创建该类的对象。从某种意义上说,我希望它对我的某些代码是“私有(private)的”,因此这样的客户端代码会失败:

 #include "Derived.h"

class Client: Base// error wanted here
{
public:
Client(...): Base{...} {...};

...
}

void client()
{
Derived d{...};// OK
Base b{...};// error wanted here
Client c{...};// error wanted here
}

我该怎么做?

实际上,我在问我怎样才能实现类似 Java's package-private classes 的东西,它们只能被同一“包”(模块)中的其他类访问,但不能被“包”之外的代码使用。

最佳答案

您可以通过将“私有(private)”实体放入 detail 命名空间来按照惯例“强制执行”这一点。许多流行的库(例如 Boost) 都这样做:

namespace detail
{
class Base { /* ... */ };
}

class Derived : private detail::Base
{
/* ... */
};

当模块被标准化时,这个问题将得到妥善解决,因为您将能够控制导出哪些实体以及哪些是实现细节。

关于c++ - 防止公共(public)使用用作私有(private)基类的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47575608/

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