類別設計工具 會顯示稱為 類別圖表 的視覺化設計介面,以提供專案中程式碼元素的視覺化表示法。 您可以使用類別圖來設計和視覺化專案中的類別和其他類型。
類別設計工具 支援下列 C++ 程式碼元素:
類別 (類似於受控類別圖形,但它可以有多個繼承關聯性)
匿名類別 (顯示類別檢視針對匿名類型產生的名稱)
範本類別
結構體
Enum
巨集(顯示巨集的後處理視圖)
Typedef
備註
這與您可以在建模專案中建立的 UML 類別圖不同。 如需詳細資訊,請參閱 UML 類別圖:參考。
類別設計工具中的 C++ 類別
類別設計工具 支援 C++ 類別,並以與 Visual Basic 和 C# 類別圖形相同的方式視覺化原生 C++ 類別,但 C++ 類別可以具有多個繼承關聯性。 您可以展開類別形狀以顯示類別中的更多欄位和方法,或摺疊它以節省空間。
備註
類別設計工具 不支援聯集 (一種特殊類型的類別,其中配置的記憶體只是聯集最大資料成員所需的數量)。
簡單繼承
當您將多個類別拖曳到類別圖表上,且類別具有類別繼承關係時,箭頭會將它們連接起來。 箭頭指向基礎類別的方向。 例如,當下列類別顯示在類別圖中時,箭頭會將它們連接起來,從 B 指向 A:
class A {};
class B : A {};
您也可以只將類別 B 拖曳至類別圖表,以滑鼠右鍵按一下 B 的類別圖形,然後按一下 [顯示基底類別]。 這將顯示其基本類別:A。
多重繼承
類別設計工具 支援多類別繼承關係的視覺化。 當衍生類別具有多個基底類別的屬性時,會使用多重繼承。 以下是多重繼承的範例:
class Bird {};
class Swimmer {};
class Penguin : public Bird, public Swimmer {};
當您將多個類別拖曳到類別圖表上,且類別具有多類別繼承關係時,箭頭會將它們連接起來。 箭頭指向基類的方向。
以滑鼠右鍵按一下類別圖形,然後按一下 [顯示基底類別] 會顯示所選類別的基底類別。
備註
C++ 程式碼不支援 Show Derived Classes 指令。 您可以移至 [ 類別檢視]、展開類型節點、展開 [衍生類型 ] 子資料夾,然後將這些類型拖曳到類別圖表上,以顯示衍生類別。
如需多重類別繼承的詳細資訊,請參閱 多重繼承 和 多個基底類別。
抽象類別
類別設計工具 支援抽象類別 (也稱為「抽象基底類別」)。 這些類別您永遠不會實例化,但您可以從中衍生其他類別。 使用本文件稍早「多重繼承」中的範例,您可以將類別具現化 Bird 為個別物件,如下所示:
int main()
{
Bird sparrow;
Bird crow;
Bird eagle;
}
不過,您可能不打算將類別具現化 Swimmer 為個別物件。 您可能只打算從中衍生出其他類型的動物類別,例如 Penguin、 和 WhaleFish。 在這種情況下,您會將類別宣告 Swimmer 為抽象基類。
若要將類別宣告為抽象,可以使用 abstract 關鍵字。 標示為抽象或包含在抽象類別中的成員是虛擬的,而且必須由衍生自抽象類別的類別實作。
class Swimmer abstract
{
virtual void swim();
void dive();
};
您也可以透過包含至少一個純虛函數來將類別宣告為抽象:
class Swimmer
{
virtual void swim() = 0;
void dive();
};
當您在類別圖中顯示這些宣告時,類別名稱 Swimmer 及其純虛函數 swim 會以抽象類別形狀以斜體顯示,以及 符號抽象類別。 請注意,抽象類別類型形狀與一般類別的形狀相同,只是其邊框是虛線。
衍生自抽象基底類別的類別必須覆寫基底類別中的每個純虛擬函數,否則無法具現化衍生類別。 因此,例如,如果您從類別Fish衍生出一個Swimmer類,Fish則必須覆寫swim該方法:
class Fish : public Swimmer
{
void swim(int speed);
};
int main()
{
Fish guppy;
}
當您在類別圖表中顯示此程式碼時, 類別設計工具 會從 Fish 繪製繼承線 到 Swimmer。
匿名類別
類別設計工具 支援匿名類別。 匿名類別類型 是在沒有識別碼的情況下宣告的類別。 它們不能有建構子或解構子,不能作為參數傳遞給函式,也不能作為函式的返回值返回。 您可以使用匿名類別將類別名稱取代為 typedef 名稱,如下列範例所示:
typedef struct
{
unsigned x;
unsigned y;
} POINT;
結構也可以是匿名的。 類別設計工具 以相同方式顯示匿名類別和結構,就像顯示特定類型一樣。 雖然您可以宣告和顯示匿名類別和結構,但 類別設計工具 不會使用您指定的標籤名稱。 它會使用類別檢視產生的名稱。 類別或結構會在 [類別檢視] 和 [類別設計工具 ] 中顯示為稱為 __unnamed 的元素。
如需匿名類別的詳細資訊,請參閱 匿名類別類型。
範本類別
類別設計工具 支援範本類別的視覺化。 支援巢狀宣告。 下表顯示一些典型宣告。
| 程式碼元素 | 類別設計器視圖 |
|---|---|
template <class T>class A {}; |
A<T>範本類別 |
template <class T, class U>class A {}; |
A<T, U>範本類別 |
template <class T, int i>class A {}; |
A<T, i>範本類別 |
template <class T, template <class K> class U>class A {}; |
A<T, U>範本類別 |
下表顯示部分特製化的一些範例。
| 程式碼元素 | 類別設計器檢視 |
|---|---|
template<class T, class U>class A {}; |
A<T, U>範本類別 |
template<class T>class A<T, T> {}; |
A<T, T>範本類別 |
template <class T>class A<T, int> {}; |
A<T, int>範本類別 |
template <class T1, class T2>class A<T1*, T2*> {}; |
A<T1*, T2*>範本類別 |
下表顯示部分特製化中繼承的一些範例。
| 程式碼元素 | 類別設計視圖 |
|---|---|
template <class T, class U>class A {};template <class TC>class A<T, int> {};class B : A<int, float>{};class C : A<int, int>{}; |
A<T, U>範本類別 BClass (指向A類別) CClass (指向A類) |
下表顯示部分特製化範本函式的一些範例。
| 程式碼元素 | 類別設計器檢視 |
|---|---|
class A{template <class T, class U>void func(T a, U b);template <class T>void func(T a, int b);}; |
Afunc<T、U> (+ 1 個重載) |
template <class T1>class A {template <class T2>class B {};};template<> template<>class A<type>::B<type> {}; |
A<T1>範本類別 B<T2>範本類別 (B 包含在 巢狀類型下的類別 A 內) |
template <class T>class C {};class A : C<int> {}; |
AClass -> C<int> C<T>範本類別 |
下表顯示範本繼承的一些範例。
| 程式碼元素 | 類別設計師檢視 |
|---|---|
template <class T>class C {};template<>class C<int> {class B {};}class A : C<int>::B {}; |
AClass ->乙 C<int>Class (B 包含在 巢狀類型下的 C 類中) C<T>範本類別 |
下表顯示標準特製化類別連線的一些範例。
| 程式碼元素 | 類別設計工具檢視 |
|---|---|
template <class T>class C {};template<>class C<int> {};class A : C<int> {};class D : C<float> {}; |
AClass ->C<整數> C<int>Class C<T>範本類別 DClass ->C<float> |
class B {template <class T>T min (const T &a, const T &b);}; |
B最小 <T> |
類別設計工具中的 C++ 列舉
類別設計工具 支援 C++ enum 和範圍類型 enum class 。 以下是一個例子:
enum CardSuit {
Diamonds = 1,
Hearts = 2,
Clubs = 3,
Spades = 4
};
// or...
enum class CardSuit {
Diamonds = 1,
Hearts = 2,
Clubs = 3,
Spades = 4
};
類別圖中的 C++ 列舉圖形看起來和運作方式如同結構圖形,只是標籤顯示為 Enum 或 Enum 類別,顏色為粉紅而非藍色,並且在左側和頂部邊界有彩色的邊框。 列舉圖形和結構圖形都有方角。
如需使用 enum 類型的詳細資訊,請參閱 列舉。
C++ 類別設計工具中的 typedef 定義
Typedef 陳述式會在名稱與其基礎類型之間建立一或多個間接層。
類別設計器 支援 C++ typedef 類型,這些類型是使用關鍵字 typedef宣告的,例如:
typedef class coord
{
void P(x,y);
unsigned x;
unsigned y;
} COORD;
然後,您可以使用此類型來宣告實例:
COORD OriginPoint;
類別和結構圖形
在 類別設計工具中,C++ typedef 具有 typedef 中指定類型的圖形。 如果來源宣告 typedef class,則圖形具有圓角,且標籤為 Class。 對於 typedef struct,形狀具有方角和標籤 Struct。
類別和結構可以在其內部宣告嵌套 typedef 型別定義。 在 類別設計工具中,類別和結構圖形可以將巢狀 typedef 宣告顯示為巢狀圖形。
Typedef 圖形支援右鍵選單(內容選單)上的「顯示為關聯」和「顯示為集合關聯」命令。
類別 typedef 範例
class B {};
typedef B MyB;
結構體 typedef 範例
typedef struct mystructtag
{
int i;
double f;
} mystruct;
未命名的類型定義
雖然您可以宣告沒有名稱的 typedef,但 類別設計工具 不會使用您指定的標籤名稱。 類別設計工具 會使用 類別檢視 產生的名稱。 例如,下列宣告有效,但它會在 [類別檢視 ] 和 [類別設計工具 ] 中顯示為名為 __unnamed 的物件:
typedef class coord
{
void P(x,y);
unsigned x;
unsigned y;
};
備註
類別設計工具 不會顯示來源類型為函式指標的 typedef。
瞭解 C++ 程式碼元素的限制
載入 C++ 專案時, 類別設計工具 會以唯讀方式運作。 您可以變更類別圖,但無法將類別圖中的變更儲存回原始程式碼。
類別設計工具 僅支援原生 C++ 語意。 對於編譯成 Managed 程式碼的 C++ 專案, 類別設計工具 只會將原生類型的程式碼元素視覺化。 因此,您可以將類別圖表新增至專案,但類別設計工具不允許您視覺化屬性設定
IsManaged為的true元素 (也就是值類型和參考類型) 。針對 C++ 專案, 類別設計工具 只會讀取類型的定義。 例如,假設您在標頭 (.h) 檔案中定義類型,並在實作 (.cpp) 檔案中定義其成員。 如果您在實作 (.cpp) 檔案上叫用「檢視類別圖表」,類別 設計工具 不會顯示任何內容。 另一個範例,如果您在.cpp檔案上叫用「檢視類別圖表」,該檔案使用
#include語句來包含其他檔案但不包含任何實際類別定義,則類別設計工具仍然不顯示任何內容。定義 COM 介面和類型程式庫的 IDL (.idl) 檔案不會顯示在圖表中,除非它們編譯成原生 C++ 程式碼。
類別設計工具 不支援全域函式和變數。
類別設計工具 不支援聯集。 這是一種特殊類型的類別,其中分配的記憶體只是聯合最大資料成員所需的數量。
類別設計工具 不會顯示基本資料類型,例如
int和char。如果專案沒有對那些在專案外部定義的類型進行正確的參考,則設計工具不會顯示這些類型。
類別設計工具 可以顯示巢狀類型,但不能顯示巢狀類型與其他類型之間的關聯性。
類別設計工具 無法顯示 void 或從 void 類型衍生的類型。
疑難排解類型解析度和顯示問題
來源檔案的位置
類別設計工具 不會追蹤來源檔案的位置。 因此,如果您修改專案結構或移動專案中的來源檔案, 類別設計工具 可能會遺失類型 (特別是 typedef 的來源類型、基底類別或關聯類型)。 您可能會收到錯誤,例如 類別設計工具無法顯示此類型。 如果這樣做,請再次將修改或重新定位的原始碼拖曳到類別圖中以重新顯示它。
更新和效能問題
對於 C++ 專案,來源檔案的變更可能需要 30 到 60 秒的時間才能出現在類別圖中。 此延遲也可能導致 類別設計工具 出現錯誤:所選內容中找不到類型。 如果您收到類似這樣的錯誤,請按一下錯誤訊息中的 [取消] ,然後等待程式碼元素出現在 類別檢視中。 執行此動作之後, 類別設計工具 應該能夠顯示類型。
如果類別圖表未更新為您在程式碼中所做的變更,您可能需要關閉圖表並重新開啟。
類型解析問題
類別設計工具 可能無法解析類型,原因如下:
類型位於未從包含類別圖之專案參考的專案或組件中。 若要更正此錯誤,請新增包含類型的專案或組合的參考。 如需相關資訊,請參閱 管理專案中的參照。
類型不在正確的範圍內,因此 類別設計工具 無法找到它。 請確定程式碼沒有漏掉
using、imports或#include語句。 此外,請確定您尚未將類型 (或相關類型) 移出其原始所在的命名空間。類型不存在 (或已註解掉)。 若要更正此錯誤,請確定您尚未註解或刪除類型。
類型位於 #import 指引所參照的程式庫中。 可能的因應措施是手動將產生的程式碼 (.tlh 檔案) 新增至標頭檔的 #include 指示詞。
請確定 類別設計工具 支援您輸入的類型。 請參閱 C++ 程式碼元素的限制。
您最有可能看到的類型解析問題錯誤是找不到 類別圖表 '<element>' 中一或多個圖形的程式碼。 此錯誤訊息並不一定表示您的程式碼有誤。 它只表示類別設計工具無法顯示您的程式碼。 請嘗試以下措施:
請確定類型存在。 確保您沒有無意中註解或刪除原始程式碼。
嘗試解析類型。 類型可能位於未從包含類別圖之專案參考的專案或組件中。 若要更正此錯誤,請新增包含類型的專案或組合的參考。 如需相關資訊,請參閱 管理專案中的參照。
請確定類型位於正確的範圍內,讓類別設計工具可以找到它。 請確定程式碼沒有遺
using漏 、imports或#include陳述式。 此外,請確定您尚未將類型 (或相關類型) 移出其原始所在的命名空間。
小提示
如需其他疑難排解資訊,請參閱 類別設計工具錯誤。