?? moc.html
字號:
</pre>
<p> 次重要的是,后面的構(gòu)造是不合法的。所有的這些都可以替換為我們通常認(rèn)為比較好的方案,所以去掉這些限制對于我們來說并不是高優(yōu)先級的。
<p> <h3> 多重繼承需要把<a href="qobject.html">QObject</a>放在第一個
</h3>
<a name="5-1"></a><p> 如果你使用多重繼承,元對象編譯器假設(shè)<em>首先</em>繼承的類是QObject的一個子類。也就是說,確信<em>僅僅</em>首先繼承的類是QObject。
<p> <pre>
class SomeClass : public <a href="qobject.html">QObject</a>, public OtherClass {
...
};
</pre>
<p> (這個限制幾乎是不可能去掉的;因?yàn)樵獙ο缶幾g器并不展開#include或者#define,它不能發(fā)現(xiàn)基類中哪個是QObject。)
<p> <h3> 函數(shù)指針不能作為信號和槽的參數(shù)
</h3>
<a name="5-2"></a><p> 在你考慮使用函數(shù)指針作為信號/槽的參數(shù)的大多數(shù)情況下,我們認(rèn)為繼承是一個不錯的替代方法。這里是一個不合法的語法的例子:
<p> <pre>
class SomeClass : public <a href="qobject.html">QObject</a> {
Q_OBJECT
...
public slots:
// 不合法的
void apply( void (*apply)(List *, void *), char * );
};
</pre>
<p> 你可以在這樣一個限制范圍內(nèi)工作:
<pre>
typedef void (*ApplyFunctionType)( List *, void * );
class SomeClass : public <a href="qobject.html">QObject</a> {
Q_OBJECT
...
public slots:
void apply( ApplyFunctionType, char * );
};
</pre>
<p> 有時用繼承和虛函數(shù)、信號和槽來替換函數(shù)指針是更好的。
<p> <h3> 友聲明不能放在信號部分或者槽部分中
</h3>
<a name="5-3"></a><p> 有時它也許會工作,但通常情況下,友聲明不能放在信號部分或者槽部分中。把它們替換到私有的、保護(hù)的或者公有的部分中。這里是一個不合法的語法的例子:
<p> <pre>
class SomeClass : public <a href="qobject.html">QObject</a> {
Q_OBJECT
...
signals:
friend class ClassTemplate<char>; // 錯的
};
</pre>
<p> <h3> 信號和槽不能被升級
</h3>
<a name="5-4"></a><p> 把繼承的成員函數(shù)升級為公有狀態(tài)這一個C++特征并不延伸到包括信號和槽。這里是一個不合法的例子:
<p> <pre>
class Whatever : public <a href="qbuttongroup.html">QButtonGroup</a> {
...
public slots:
void QButtonGroup::buttonPressed; // 錯的
...
};
</pre>
<p> QButtonGroup::buttonPressed()槽是保護(hù)的。
<p> C++測驗(yàn):如果你試圖升級一個被重載的保護(hù)成員函數(shù)將會發(fā)生什么?
<ol type=1>
<li> 所有的函數(shù)都被重載。
<li> 這不是標(biāo)準(zhǔn)的C++。
</ol>
<p>
<p> <h3> 類型宏不能被用于信號和槽的參數(shù)
</h3>
<a name="5-5"></a><p> 因?yàn)樵獙ο缶幾g器并不展開#define,在信號和槽中類型宏作為一個參數(shù)是不能工作的。這里是一個不合法的例子:
<p> <pre>
#ifdef ultrix
#define SIGNEDNESS(a) unsigned a
#else
#define SIGNEDNESS(a) a
#endif
class Whatever : public <a href="qobject.html">QObject</a> {
...
signals:
void someSignal( SIGNEDNESS(int) );
...
};
</pre>
<p> 不含有參數(shù)的#define將會像你所期望的那樣工作。
<p> <h3> 嵌套類不能放在信號部分或者槽部分,也不能含有信號和槽
</h3>
<a name="5-6"></a><p> 這里是一個例子:
<p> <pre>
class A {
Q_OBJECT
public:
class B {
public slots: // 錯的
void b();
...
};
signals:
class B { // 錯的
void b();
...
}:
};
</pre>
<p> <h3> 構(gòu)造函數(shù)不能用于信號部分和槽部分
</h3>
<a name="5-7"></a><p> 為什么一個人會把一個構(gòu)造函數(shù)放到信號部分或者槽部分,這對于我們來說都是很神秘的。你無論如何也不能這樣做(除去它偶爾能工作的情況)。請把它們放到私有的、保護(hù)的或者公有的部分中,它們本該屬于的地方。這里是一個不合法的語法的例子:
<p> <pre>
class SomeClass : public <a href="qobject.html">QObject</a> {
Q_OBJECT
public slots:
SomeClass( <a href="qobject.html">QObject</a> *parent, const char *name )
: <a href="qobject.html">QObject</a>( parent, name ) { } // 錯的
...
};
</pre>
<p> <h3> 屬性的聲明應(yīng)該放在含有相應(yīng)的讀寫函數(shù)的公有部分之前
</h3>
<a name="5-8"></a><p> 在包含相應(yīng)的讀寫函數(shù)的公有部分之中和之后聲明屬性的話,讀寫函數(shù)就不能像所期望的那樣工作了。元對象編譯器會抱怨不能找到函數(shù)或者解析這個類型。這里是一個不合法的語法的例子:
<p> <pre>
class SomeClass : public <a href="qobject.html">QObject</a> {
Q_OBJECT
public:
...
Q_PROPERTY( Priority priority READ priority WRITE setPriority ) // 錯的
Q_ENUMS( Priority ) // 錯的
enum Priority { High, Low, VeryHigh, VeryLow };
void setPriority( Priority );
Priority priority() const;
...
};
</pre>
<p> 根據(jù)這個限制,你應(yīng)該在Q_OBJECT之后,在這個類的聲明之前聲明所有的屬性:
<p> <pre>
class SomeClass : public <a href="qobject.html">QObject</a> {
Q_OBJECT
Q_PROPERTY( Priority priority READ priority WRITE setPriority )
Q_ENUMS( Priority )
public:
...
enum Priority { High, Low, VeryHigh, VeryLow };
void setPriority( Priority );
Priority priority() const;
...
};
</pre>
<p>
<!-- eof -->
<p><address><hr><div align=center>
<table width=100% cellspacing=0 border=0><tr>
<td>Copyright © 2002
<a href="http://www.trolltech.com">Trolltech</a>
<td><a href="http://www.trolltech.com/trademarks.html">Trademarks</a>
<td><a href="zh_CN.html">譯者:Cavendish</a>
<td align=right><div align=right>Qt 3.0.5版</div>
</table></div></address></body>
</html>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -