C++11 将工厂声明为基类的友元

2023-11-26

我正在尝试为派生类创建一个工厂。我只希望工厂能够创建派生类的实例,因此我创建了基本构造函数protected;派生类仅使用基类构造函数,因此它们的构造函数是protected also.

我试图将工厂声明为基类的友元,以便它可以访问protected构造函数。当我使用这个命令编译时

clang++ -std=c++11 -stdlib=libc++ Friends.cpp -o Friends

我收到此错误:

Friends.cpp:23:20: error: calling a protected constructor of class 'A'
        return new T(i);
               ^
Friends.cpp:42:16: note: in instantiation of function template specialization 'Create<A>' requested
      here
        A* a = Create<A>(1);
           ^
Friends.cpp:30:25: note: declared protected here
             using Base::Base;
                    ^

以及派生类的类似错误B.

我从 stackoverflow.com 上阅读其他问题得到的感觉是,这在 C++11 中是不可能的,但我不确定为什么。有人可以解释为什么这行不通,也许还有替代方案吗?

示例代码

#include <iostream>

using namespace std;

// Forward declaration
template<class T> T* Create(int i);

class Base {
    public:
        template<class T>
        friend T* Create(int);
        virtual void say() = 0;

    protected:
        Base(int i): i(i) { }   // This won't compile
        int i;
};

// Factory for Base class
template<class T>
T* Create(int i){
    return new T(i);
}

class A: public Base {
    public:
        using Base::Base;
        void say() { cout << "I am A and have a value of " << i << endl; }
};

class B: public Base{
    public:
        using Base::Base;
        void say() { cout << "I am B and have a value of " << i << endl; }
};

int main(){
    cout << "I'm creating A." << endl;
    A* a = Create<A>(1);
    a->say();

    cout << "I'm creating B." << endl;
    B* b = Create<B>(2);
    b->say();

    return 0;
}

当您从基类继承构造函数时,无论您将构造函数放在何处,它都会保留原始构造函数的访问权限using派生类中的声明。

From §12.9/4 [类.inhctor]

如此声明的构造函数与中的相应构造函数具有相同的访问权限X. ...

如果您显式向派生类添加构造函数而不是从派生类继承它们,则可以修复该错误Base.

A(int i) : Base(i) {}

and

B(int i) : Base(i) {}

现场演示

当然,另一个解决方案是Base的构造函数public。你也可以让它的析构函数protected,但这不是必需的,因为由于纯虚拟成员函数,该类无论如何都无法实例化。

class Base {
    public:
        template<class T>
        friend T* Create(int);
        virtual void say() = 0;

        Base(int i): i(i) { }   // This won't compile
        int i;
    protected:
        ~Base() {}
};

现场演示

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++11 将工厂声明为基类的友元 的相关文章

  • 如何检查图像对象与资源中的图像对象是否相同?

    所以我试图创建一个简单的程序 只需在单击图片框中更改图片即可 我目前只使用两张图片 所以我的图片框单击事件函数的代码 看起来像这样 private void pictureBox1 Click object sender EventArgs
  • C# 和 Javascript SHA256 哈希的代码示例

    我有一个在服务器端运行的 C 算法 它对 Base64 编码的字符串进行哈希处理 byte salt Convert FromBase64String serverSalt Step 1 SHA256Managed sha256 new S
  • ASP.NET Core Serilog 未将属性推送到其自定义列

    我有这个设置appsettings json对于我的 Serilog 安装 Serilog MinimumLevel Information Enrich LogUserName Override Microsoft Critical Wr
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • 从父类调用子类方法

    a doStuff 方法是否可以在不编辑 A 类的情况下打印 B did stuff 如果是这样 我该怎么做 class Program static void Main string args A a new A B b new B a
  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • C++ 子字符串返回错误结果

    我有这个字符串 std string date 20121020 我正在做 std cout lt lt Date lt lt date lt lt n std cout lt lt Year lt lt date substr 0 4 l
  • 使闭包捕获的变量变得易失性

    闭包捕获的变量如何与不同线程交互 在下面的示例代码中 我想将totalEvents 声明为易失性的 但C 不允许这样做 是的 我知道这是错误的代码 这只是一个例子 private void WaitFor10Events volatile
  • C - 找到极限之间的所有友好数字

    首先是定义 一对友好的数字由两个不同的整数组成 其中 第一个整数的除数之和等于第二个整数 并且 第二个整数的除数之和等于第一个整数 完美数是等于其自身约数之和的数 我想做的是制作一个程序 询问用户一个下限和一个上限 然后向他 她提供这两个限
  • C#:如何防止主窗体过早显示

    在我的 main 方法中 我像往常一样启动主窗体 Application EnableVisualStyles Application SetCompatibleTextRenderingDefault false Application
  • Web API - 访问 DbContext 类中的 HttpContext

    在我的 C Web API 应用程序中 我添加了CreatedDate and CreatedBy所有表中的列 现在 每当在任何表中添加新记录时 我想填充这些列 为此目的我已经覆盖SaveChanges and SaveChangesAsy
  • 在 ASP.NET Core 3.1 中使用包含“System.Web.HttpContext”的旧项目

    我们有一些用 Net Framework编写的遗留项目 应该由由ASP NET Core3 1编写的API项目使用 问题是这些遗留项目正在使用 System Web HttpContext 您知道它不再存在于 net core 中 现在我们
  • 如何将图像路径保存到Live Tile的WP8本地文件夹

    我正在更新我的 Windows Phone 应用程序以使用新的 WP8 文件存储 API 本地文件夹 而不是 WP7 API 隔离存储文件 旧的工作方法 这是我如何成功地将图像保存到 共享 ShellContent文件夹使用隔离存储文件方法
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • 当操作繁忙时,表单不执行任何操作(冻结)

    我有一个使用 C 的 WinForms 应用程序 我尝试从文件中读取一些数据并将其插入数据表中 当此操作很忙时 我的表单冻结并且无法移动它 有谁知道我该如何解决这个问题 这可能是因为您在 UI 线程上执行了操作 将文件和数据库操作移至另一个
  • C++ 复制初始化和直接初始化,奇怪的情况

    在继续阅读本文之前 请阅读在 C 中 复制初始化和直接初始化之间有区别吗 https stackoverflow com questions 1051379 is there a difference in c between copy i
  • 如何让Gtk+窗口背景透明?

    我想让 Gtk 窗口的背景透明 以便只有窗口中的小部件可见 我找到了一些教程 http mikehearn wordpress com 2006 03 26 gtk windows with alpha channels https web
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • mysql-connector-c++ - “get_driver_instance”不是“sql::mysql”的成员

    我是 C 的初学者 我认为学习的唯一方法就是接触一些代码 我正在尝试构建一个连接到 mysql 数据库的程序 我在 Linux 上使用 g 没有想法 我运行 make 这是我的错误 hello cpp 38 error get driver
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif

随机推荐

  • 如何使用 jQuery Migrate 插件

    我正在使用 jquery 2 0 但还想使用 jQuery migrate 插件 以便我的网站可以在旧版浏览器上运行 然而 我一直没能成功地让它发挥作用 我的 html 标题部分有以下内容
  • 如何拦截具有标准 java 功能(无 AspectJ 等)的方法调用?

    我想拦截对某个类 MyClass 的所有方法调用 以便能够对某些 setter 调用做出反应 我尝试使用动态代理 但据我所知 这只适用于实现某些接口的类 但MyClass没有这样的接口 除了实现包装类之外 是否还有其他方法将所有调用委托给成
  • “列表”对象没有属性“查找”

    我知道这是一个基本问题 但我是 python 新手 不知道如何解决它 我有一个类似于下一个示例的列表 entities 1 IFCORGANIZATION Autodesk Revit 2014 ENU 5 IFCAPPLICATION 1
  • Android Https Web 服务通信 (SSL / TLS 1.2)

    在我的 Android 应用程序中 我必须与 https Web 服务进行通信并读取响应 我已经通知服务器配置了SSL with TLS 1 2 我使用以下示例代码来连接服务 https get 请求 但仅限运行的设备安卓5 0或以上可以成
  • 在Python中播放和控制mp3文件?

    首先 我是一名 Python 初学者 具有典型的面向对象知识的 C Java 背景 我确信要尝试使用 Python 来完成我当前正在做的工作 到目前为止我很喜欢它 我遇到的一个问题是找到一个好的 mp3 模块 我尝试过 TkSnack 它安
  • 如何以编程方式更新 UIView 的恒定高度约束?

    我有一个UIView我使用 Xcode Interface Builder 设置约束 现在我需要更新UIView以编程方式保持实例的高度常量 有一个函数就像myUIView updateConstraints 但我不知道如何使用它 从界面构
  • Symfony 注销处理程序

    我只是尝试了几个小时来弄清楚如何在注销操作后使闪存消息正常工作 安全 yml login pattern login security false secured area pattern form login check path che
  • 无法监听UIAxes的YLim属性

    MATLAB 提供了addlistener功能 监听器使我们能够跟踪对象属性的变化并对其采取行动 例如 我们可以创建一个非常简单的侦听器 当 YLim 的财产axes对象被改变 Example using axes ax axes addl
  • 句子间距[关闭]

    Closed 这个问题是基于意见的 目前不接受答案 呈现句子之间应有的额外间距的最佳方式是什么 使用 X HTML CSS p Lorem ipsum Dolor sit amet p wider than word spacing 由于
  • 在循环(或推导式)中创建函数(或 lambda)

    我正在尝试在循环内创建函数 functions for i in range 3 def f return i alternatively f lambda i functions append f 问题是所有功能最终都是相同的 所有三个函
  • 使用现有私钥和 RS256 算法生成 JWT

    我有以下 RSA 私钥 并且我必须生成 JWT 令牌使用RS256算法 这是我的样本私钥 BEGIN RSA PRIVATE KEY MIIEoAIBAAKCAQEAnFWdIwBbLRw4xfFDXYFmlXKB4BpKeuAtfh1dc
  • Java 中的嵌套函数

    Java 编程语言是否有任何扩展可以创建嵌套函数 在很多情况下 我需要创建仅在另一个方法或 for 循环的上下文中使用一次的方法 到目前为止 我还无法在 Java 中完成此任务 尽管可以在 JavaScript 中轻松完成 例如 这不能在标
  • 如何使用 Popen 在一个进程中运行多个命令?

    我想打开一个进程并在同一进程中运行两个命令 我有 cmd1 source usr local cmd2 ls l final Popen cmd2 shell True stdin PIPE stdout PIPE stderr STDOU
  • 如何全局设置 Jackson 以忽略 Spring 中的未知属性?

    Jackson 使用以下注释来忽略类中的未知属性 JsonIgnoreProperties ignoreUnknown true 它允许您使用此注释忽略特定属性 JsonIgnore 如果您想全局设置它 您可以修改对象映射器 jackson
  • 使用 Commons CSV 解析 CSV - 引号内的引号导致 IOException

    我在用共享 CSV解析与电视节目相关的 CSV 内容 其中一个节目的节目名称包含双引号 116 6 2 29 九月 10 JJ 60 分钟 http www tvmaze com episodes 4855 criminal minds 6
  • jQuery 根据类重新排序列表项

    有没有一种简单的方法可以使用类重新排序我的列表项 我想指定一个类来首先显示列表顶部的这些项目 然后列出下面的其他列表项目 ul class order me li class normal content li li class norma
  • 批处理命令捕获所有可能的 ping 问题

    我有一个关于验证 ping 是否在批处理命令中正确返回的问题 目前 我必须通过 3 种不同的方式检查 ping 才能知道服务器实际上已启动 我想将这些组合成一个 ping 命令 我尝试过使用不同的错误级别或不使用错误级别 0 等 它们都没有
  • 连续的 CSS 过渡

    有没有办法连续动画背景图像background position使用 CSS3 转换的属性 是的 有可能 DEMO div background url http lorempixel com 100 100 height 100px wi
  • mvc3 https 和 http

    我正在将 ASP NET 应用程序转换为 MVC3 假设我有一个需要 https 的登录页面 而其他每个页面只需要 http 如何将登录重定向到 https 并将所有其他页面保留在 http 上 任何建议都会很棒 The RequireHt
  • C++11 将工厂声明为基类的友元

    我正在尝试为派生类创建一个工厂 我只希望工厂能够创建派生类的实例 因此我创建了基本构造函数protected 派生类仅使用基类构造函数 因此它们的构造函数是protected also 我试图将工厂声明为基类的友元 以便它可以访问prote