2013-08-25 37 views
1

請看看下面的代碼:
的Qt:創建QStackedLayout

QStackedLayout stackLayout(this); 
QStackedLayout stackLayout = QStackedLayout(this); 

我有兩個問題:
爲什麼是第二條語句不可能的?
當我在頭文件中聲明變量而不是指針時,如何調用QStackedLayout的構造函數?

+0

我真的不明白你的第二個問題。你能否展示一些你想工作但不喜歡的代碼示例?還請說明你所得到的確切的編譯錯誤。 – Mat

回答

1

你應該定義stackLayout爲指針

QStackedLayout* stackLayout = new QStackedLayout(this); 
-2

的第一個問題很簡單:QStackedayout inherites QObject的。你永遠不能複製或分配QObject。

第二個問題你要做的是調用QStackedLayout的構造函數。但我想你真的想知道,如何在你的.h文件中做到這一點?只有默認的構造函數是可能的。指針在這種情況下很好。或者你把QStackedLayout layout放在你的.h文件中,並在你的構造函數中添加類似layout.setParent(this)的東西。我從來沒有這樣做過。我看起來很奇怪。所以我不知道是否有任何缺點。

編輯:嗯... 臉紅 ...的 '唯一默認構造函數' 當然是無稽之談。有時候會花費更長的時間思考一兩次。特別是關於構造,這自己很少使用。 :-)

+1

您可以使用初始化程序列表以某種方式構造成員變量。 「只有默認的構造函數是可能的」是錯誤的。 – nijansen

+0

在這種情況下,它是正確的,因爲QStackedLayout不可複製。嘗試一下。 – Greenflow

+1

又錯了。類構造函數的初始化列表與複製對象沒有任何關係,請參閱http://ideone.com/5TzPXd – nijansen

2

首先,我認爲你錯誤地解釋了構造函數。 Qt可以充分用於其元素父,因爲在堆上創建時將管理他們的存儲時間:

// here you need this constructor, so Qt will free the resource for you 
QStackedLayout * layout = new QStackedLayout(this); 
// here you don't need it, the object has automatic storage duration 
QStackedLayout layout; 

然後,如果你想呼籲在你的頭文件中聲明的對象有一定的構造,使用初始化列表:

struct foo 
{ 
    foo() 
     : s("demo") 
    {} 
    std::string s; 
}; 

對象從QObject派生,因而是不可拷貝 - 這就是爲什麼你的第二個語句不起作用。