2015-11-18 26 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->,而不是任何其他代碼。