【问题标题】:Initializing static class object with no zero argument constructor c++初始化没有零参数构造函数c ++的静态类对象
【发布时间】:2015-11-18 22:19:45
【问题描述】:

我的代码相关部分如下:

在 foo.h 中:

namespace foo_ns {
class Foo
{
    static Class1 object1;
};
}

在 foo.cpp 中

#include <foo.h>
namespace foo_ns {

Class1 Foo::object1(/*another object. Need to call copy constructor*/)

}

这里,“另一个对象”在main() 中定义。此外,Class1 是大型库的一部分,并且没有零参数构造函数,因此在编译期间只需删除括号就会产生no matching function call 错误。据我了解,静态初始化必须在任何函数之外执行。

那么有什么解决方法吗?

【问题讨论】:

  • 您需要先初始化不带括号或大括号的静态变量。然后将要在 main 中复制的对象分配给它。抱歉,我没有看到 cmets 的答案。
  • 一个非常相似的问题:stackoverflow.com/questions/33572283/….
  • 正如我所说,我最初没有使用括号并得到上述错误。使用大括号初始化会导致错误 must be initialized by constructor, not by {...} 前面有另一个错误 extended initializer lists only available with std=c++11
  • @Ali250 你不使用 C++11 有充分的理由吗?
  • @M.M 长话短说,我正在使用一个名为 catkin 的构建系统,它用于机器人操作系统 (ROS)。官方说,ROS 仍然在 C++03 上,我正在使用许多用 C++03 编写的库,论坛上的人们通常说混合 c++03 和 c++11 代码不是一个好主意。

标签: c++ static initialization copy-constructor


【解决方案1】:

当然,如果Class1 有您以后可以使用的方法,那么一个简单的解决方案是:

Class1 Foo::object1(some_rubbish);

// in main
object1 = Class1(the_real_initializer);

如果Class1 没有有效的赋值运算符,但可以安全地销毁并重新创建它,则可以在 main 中编写:

object1.~Class1();
new(&object1) Class1(the_real_initializer);

虽然如果这个构造函数抛出,那么你必须中止程序。


如果无法在程序结束之前正确销毁Class1,那么您将不得不推迟其初始化,例如:

static std::unique_ptr<Class1> p_object1;

然后在 main 中,当你准备好时,

p_object1.reset( new Class1(bla bla bla) );

这样,您必须将访问object1. 的任何其他代码更改为使用p_object1-&gt;

【讨论】:

    猜你喜欢
    • 2021-04-29
    • 2010-11-14
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 2021-11-06
    相关资源
    最近更新 更多