2015-11-18 98 views
0

我的代码的相关部分如下:初始化静态类对象没有零参数构造C++

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错误。据我所知,静态初始化必须在任何函数之外执行。

所以ithere这方面的任何解决方法吗?

+0

你需要先用括号没有或括号来初始化静态变量。然后为其分配主要复制的对象。对不起,我没有看到评论。 – 101010

+1

一个非常类似的问题:http://stackoverflow.com/questions/33572283/can-i-initialize-a-static-const-member-at-run-time-in-c。 –

+0

正如我所说,我最初使用没有括号,并得到上述错误。使用大括号初始化给出了错误'必须通过构造函数初始化,而不是由{...}'这是唯一可用的性病另一个错误'扩展初始化列表前面= C++ 11' – Ali250

回答

1

当然,如果Class1有,你可以使用后即可方法一个简单的解决办法是:

Class1 Foo::object1(some_rubbish); 

// in main 
object1 = Class1(the_real_initializer); 

如果Class1没有工作赋值运算符,但它可以安全地销毁,重新创建,你可以写在主要:

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

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


如果无法将程序结束前正确地摧毁一个Class1那么你将不得不推迟它的初始化,如:

static std::unique_ptr<Class1> p_object1; 

,然后在主,当你准备好,

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

这种方式,您将不得不改变访问object1.使用p_object1->,而不是任何其他代码。