C++ 初始化列表功能:调用函数而不初始化成员?

2024-02-07

这是一个关于 C++ 初始化列表语法的问题。

是否可以从初始化列表中调用函数而不将它们作为成员对象构造函数的参数?

下面列出的代码示例是根据工作中的类似情况进行解释(paracoded?)。

情况

  • 成员变量采用指向单例的指针作为构造函数 争论。
  • 成员变量由其包含类的构造函数中的初始值设定项列表构造。
  • 在构造包含类之前尚未创建单例。

The Code

#include <iostream>

#define LOG { std::cout << __PRETTY_FUNCTION__ << std::endl; }

namespace
{

template <class T>
class SingletonService
{
public:
    static T* Instance() { LOG; return mpT; }
    static void InstallInstance(T* pT) { LOG; mpT = pT; }
    static void DeleteInstance() { if (mpT) delete mpT; }

protected:
    static T* mpT;
};

template <class T>
T* SingletonService<T>::mpT = NULL;

class OneOfMe
{
public:
    OneOfMe() { LOG; };
    virtual ~OneOfMe() { };
};

class Container
{
public:
    Container(OneOfMe* pObj) { LOG; /* Do something with pObj */ }
    virtual ~Container() { }
};

int GenerateNum()
{
    return 42;
}

class Baz
{
public:
    Baz(int num) : mNum(num) { LOG; }
    virtual ~Baz() { }
protected:
    int mNum;
};

class Bar
{
public:
    Bar() : mBaz(GenerateNum()) { LOG; } // Perfectly OK to call function that is argument to member object's non-default ctor.
    virtual ~Bar() { };

protected:
    Baz mBaz;
};

class Foo
{
public:
    Foo()
        : SingletonService<OneOfMe>::InstallInstance(new OneOfMe) // Compile error
        , mContainer(SingletonService<OneOfMe>::Instance()) { }
    virtual ~Foo() { };
protected:
    Container mContainer;
};

}

int main(int argc, char* argv[])
{
    LOG;
    Bar bar;

    SingletonService<OneOfMe>::InstallInstance(new OneOfMe);    // This works.
    Container container(SingletonService<OneOfMe>::Instance()); // And this works.
    SingletonService<OneOfMe>::DeleteInstance();
    return 0;
}

编译错误

>g++ main.cpp
main.cpp: In constructor ‘<unnamed>::Foo::Foo()’:
main.cpp:45: error: expected class-name before ‘(’ token
main.cpp:45: error: no matching function for call to
‘<unnamed>::Container::Container()’
main.cpp:37: note: candidates are:
<unnamed>::Container::Container(<unnamed>::OneOfMe*)
main.cpp:35: note:
<unnamed>::Container::Container(const<unnamed>::Container&)
main.cpp:45: error: expected ‘{’ before ‘(’ token

问题

在语法上是否可以从类构造函数的初始值设定项列表中调用函数不作为成员对象的非默认构造函数的参数?

这个问题是出于学术好奇心。我知道至少另一种解决方案是在创建包含类之前实例化单例。


您可以利用逗号运算符 http://en.cppreference.com/w/cpp/language/operator_other#Built-in_comma_operator.

在你的例子中

class Foo
{
public:
    Foo()
        : mContainer((SingletonService<OneOfMe>::InstallInstance(new OneOfMe),
                      SingletonService<OneOfMe>::Instance()))
    {}
    virtual ~Foo();
protected:
    Container mContainer;
};

请注意两个表达式周围的附加括号,否则它们将被解释为两个而不是一个参数。


解决这个特定问题的另一种方法可能是从InstallInstance()以及,例如

template <class T>
class SingletonService {
public:
    static T *InstallInstance(T *pT) { LOG; return mpT = pT; }
};

and then

class Foo {
public:
    Foo()
        : mContainer(SingletonService<OneOfMe>::InstallInstance(new OneOfMe)) {}
    virtual ~Foo();
protected:
    Container mContainer;
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 初始化列表功能:调用函数而不初始化成员? 的相关文章

随机推荐

  • 在 VS 2012 中保存/导出单元测试结果

    如何在 VS 2012 中导出单元测试结果 我知道从来没有直接的方法可以做到这一点 尽管应该有 但至少在 2012 年我能够保存测试结果窗口中的结果 并使用 trx2html 将它们转换为可读的内容 在 2012 年 我没有看到测试资源管理
  • Azure Databricks 和表单识别器 - 图像无效或受密码保护

    我正在尝试使用 Databricks 自动化 Azure 表单识别器流程 我会将 pdf 或 jpg 文件放入 blob 中 并在 Databricks 中运行代码 将文件发送到表单识别器 执行数据识别并将结果放入 blob 中的新 csv
  • 如何防止网站检测到 Fiddler

    问题标题可能没有涵盖整个主题 因为我做了很多研究并发现了许多奇怪的事情 因此 首先 我想要实现的是某种代表用户工作的网站客户端 不做任何非法的事情 只是优化用户的一些工作流程 我已经为很多网站这样做过 效果很好 然而 目前的情况存在一个问题
  • 如何选择 HTML5 画布形状?

    我有一个 HTML5 画布 在上面绘制了几个形状 我想要发生的是 当鼠标单击任何形状时 应该选择该形状 至少它可以告诉选择了哪种形状 谢谢 尝试使用现有的画布库 或创建您自己的 该库在选择形状时会发生事件 下面的示例使用动力学 JS 库 h
  • Backbone.js 和 Require.js:不匹配的匿名 Define() 模块:function (_, Backbone) {

    我刚开始使用 require js 并且将以下 app js 文件作为我的主干应用程序的一部分 require config baseUrl js paths jquery libs jquery 2 1 0 underscore libs
  • Keras ConvLSTM2D:输出层上的 ValueError

    我正在尝试训练 2D 卷积 LSTM 以根据视频数据进行分类预测 然而 我的输出层似乎遇到了问题 ValueError 检查目标时出错 预期dense 1 有 5 个维度 但得到了形状为 1 1939 9 的数组 我当前的模型基于ConvL
  • 在 C# 中接受浮点不准确有什么好处

    我一直在想这个问题last https stackoverflow com questions 4598416 fourier transform rounding error few https stackoverflow com que
  • 当我有 hive-site.xml 时,hive shell 无法打开

    我已经在我的VM播放器中安装了ubuntu 14和hadoop 2 6 0以及Hive 0 14 0 在我的 Hive conf 中没有 Hive site xml 所以我创建了一个新文件 但是当我打开 Hive shell 时出现错误 如
  • knitr kable (Sweave) 中的 LaTeX 数学表达式

    是否可能以及如何在 knit Sweave 报告中使用 LaTeX 数学表达式kable 在下面的例子中 x 2 被呈现为 原样 With xtable 对于下面的示例 我将使用该选项sanitize colnames function f
  • 创建指向非静态类成员函数的类成员指针函数变量

    目标是拥有成员变量 AddValue指向CreateFirstValue类初始化时和第一次调用后的函数AddValue 所有未来对它的调用都将调用CreateAnotherValue 以前 我只有一个AddValue带有条件检查的函数以确定
  • Android 中的 Fling 手势和 Webview

    我有一个 webview 控件 需要支持 Android 中的 fling 手势 以便调出新记录 加载新数据 这是在扩展 Activity 的类中发生的 我见过的所有示例都展示了如何实现对文本视图的手势支持 但没有展示对网络视图的手势支持
  • 使用()创建对象与不使用()创建对象的区别

    我刚刚遇到问题 error request for member show in myWindow which is of non class type MainGUIWindow 当尝试编译一个简单的 qt 应用程序时 include
  • 忽略 New Relic 中的持久 SignalR 连接

    我应该打电话到哪里NewRelic Api Agent NewRelic IgnoreApdex or NewRelic Api Agent NewRelic IgnoreTransaction 在我的 SignalR 集线器中以防止长时间
  • DataGrid 内 ComboBox 上的 ItemSsource 绑定

    DataGrid 内的组合框未填充列表 我认为 ItemSource Path 有问题 查看 DataGrid 的 xaml 代码
  • MVC 4 Razor 文件上传

    我是 MVC 4 的新手 我正在尝试在中实现文件上传控制 我的网站 我无法找到错误 我得到的是空值 我的文件中的值 控制器 public class UploadController BaseController public Action
  • “Function.call.bind(Function.bind)”是什么意思?

    我需要你的帮助 我被这些代码行困住了 var bind Function call bind Function bind bind CC Components 我试图理解它们是什么以及它们如何工作 但我不能 有人可以帮助清楚地解释它们是如何
  • 自定义字符串分隔符 stringtemplate-4

    我正在尝试在 android 中使用 stringtemplate 4 引 擎 但我需要起始分隔符 而结束分隔符应该是 在这里 我认为只允许使用字符分隔符 那么如何使用字符串分隔符呢 提前致谢 StringTemplate 仅支持使用单个字
  • Tornadofx - 如何在每个实例上将参数传递给 Fragment

    我是javafx kotlin 和tornadofx 的新手 Issue 如何在每个实例上将参数传递给 Fragment 假设我有一个表视图布局作为我的片段 现在这个片段在多个地方使用 但具有不同的数据集 例如 添加片段 class Som
  • jest 从承诺中模拟 jQuery 函数

    我有一个调用 jQuery 函数的函数 jQuery 函数称为dataFunc并且应该返回一个对象 我想测试承诺 而不是dataFunc功能 为此 我想嘲笑这样的回应dataFunc应该返回 我想要这一行const data await s
  • C++ 初始化列表功能:调用函数而不初始化成员?

    这是一个关于 C 初始化列表语法的问题 是否可以从初始化列表中调用函数而不将它们作为成员对象构造函数的参数 下面列出的代码示例是根据工作中的类似情况进行解释 paracoded 情况 成员变量采用指向单例的指针作为构造函数 争论 成员变量由