共用方式為


在類別設計工具中使用 C++ 程式碼

類別設計工具 會顯示稱為 類別圖表 的視覺化設計介面,以提供專案中程式碼元素的視覺化表示法。 您可以使用類別圖來設計和視覺化專案中的類別和其他類型。

類別設計工具 支援下列 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>

範本類別

B

Class

(指向A類別)

C

Class

(指向A類)

下表顯示部分特製化範本函式的一些範例。

程式碼元素 類別設計器檢視
class A

{

template <class T, class U>

void func(T a, U b);

template <class T>

void func(T a, int b);

};
A

func<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> {};
A

Class

-> C<int>

C<T>

範本類別

下表顯示範本繼承的一些範例。

程式碼元素 類別設計師檢視
template <class T>

class C {};

template<>

class C<int> {

class B {};

}

class A : C<int>::B {};
A

Class

->乙

C<int>

Class

(B 包含在 巢狀類型下的 C 類中)

C<T>

範本類別

下表顯示標準特製化類別連線的一些範例。

程式碼元素 類別設計工具檢視
template <class T>

class C {};

template<>

class C<int> {};

class A : C<int> {};

class D : C<float> {};
A

Class

->C<整數>

C<int>

Class

C<T>

範本類別

D

Class

->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++ 列舉圖形看起來和運作方式如同結構圖形,只是標籤顯示為 EnumEnum 類別,顏色為粉紅而非藍色,並且在左側和頂部邊界有彩色的邊框。 列舉圖形和結構圖形都有方角。

如需使用 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;

類別設計工具中的 C++ 類別 typedef

結構體 typedef 範例

typedef struct mystructtag
{
    int   i;
    double f;
} mystruct;

類別設計工具中的 C++ 結構 typedef

未命名的類型定義

雖然您可以宣告沒有名稱的 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++ 程式碼。

  • 類別設計工具 不支援全域函式和變數。

  • 類別設計工具 不支援聯集。 這是一種特殊類型的類別,其中分配的記憶體只是聯合最大資料成員所需的數量。

  • 類別設計工具 不會顯示基本資料類型,例如 intchar

  • 如果專案沒有對那些在專案外部定義的類型進行正確的參考,則設計工具不會顯示這些類型。

  • 類別設計工具 可以顯示巢狀類型,但不能顯示巢狀類型與其他類型之間的關聯性。

  • 類別設計工具 無法顯示 void 或從 void 類型衍生的類型。

疑難排解類型解析度和顯示問題

來源檔案的位置

類別設計工具 不會追蹤來源檔案的位置。 因此,如果您修改專案結構或移動專案中的來源檔案, 類別設計工具 可能會遺失類型 (特別是 typedef 的來源類型、基底類別或關聯類型)。 您可能會收到錯誤,例如 類別設計工具無法顯示此類型。 如果這樣做,請再次將修改或重新定位的原始碼拖曳到類別圖中以重新顯示它。

更新和效能問題

對於 C++ 專案,來源檔案的變更可能需要 30 到 60 秒的時間才能出現在類別圖中。 此延遲也可能導致 類別設計工具 出現錯誤:所選內容中找不到類型。 如果您收到類似這樣的錯誤,請按一下錯誤訊息中的 [取消] ,然後等待程式碼元素出現在 類別檢視中。 執行此動作之後, 類別設計工具 應該能夠顯示類型。

如果類別圖表未更新為您在程式碼中所做的變更,您可能需要關閉圖表並重新開啟。

類型解析問題

類別設計工具 可能無法解析類型,原因如下:

  • 類型位於未從包含類別圖之專案參考的專案或組件中。 若要更正此錯誤,請新增包含類型的專案或組合的參考。 如需相關資訊,請參閱 管理專案中的參照

  • 類型不在正確的範圍內,因此 類別設計工具 無法找到它。 請確定程式碼沒有漏掉usingimports#include語句。 此外,請確定您尚未將類型 (或相關類型) 移出其原始所在的命名空間。

  • 類型不存在 (或已註解掉)。 若要更正此錯誤,請確定您尚未註解或刪除類型。

  • 類型位於 #import 指引所參照的程式庫中。 可能的因應措施是手動將產生的程式碼 (.tlh 檔案) 新增至標頭檔的 #include 指示詞。

  • 請確定 類別設計工具 支援您輸入的類型。 請參閱 C++ 程式碼元素的限制

您最有可能看到的類型解析問題錯誤是找不到 類別圖表 '<element>' 中一或多個圖形的程式碼。 此錯誤訊息並不一定表示您的程式碼有誤。 它只表示類別設計工具無法顯示您的程式碼。 請嘗試以下措施:

  • 請確定類型存在。 確保您沒有無意中註解或刪除原始程式碼。

  • 嘗試解析類型。 類型可能位於未從包含類別圖之專案參考的專案或組件中。 若要更正此錯誤,請新增包含類型的專案或組合的參考。 如需相關資訊,請參閱 管理專案中的參照

  • 請確定類型位於正確的範圍內,讓類別設計工具可以找到它。 請確定程式碼沒有遺 using漏 、 imports#include 陳述式。 此外,請確定您尚未將類型 (或相關類型) 移出其原始所在的命名空間。

小提示

如需其他疑難排解資訊,請參閱 類別設計工具錯誤