共用方式為


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

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

[類別設計工具] 支援下列 C++ 程式碼項目:

  • 類別 (類似於 Managed 類別圖形,差別在於它可以有多個繼承關聯性)

  • 匿名類別 (會顯示類別檢視為匿名類型產生的名稱)

  • 範本類別

  • 結構

  • 列舉

  • 巨集 (會顯示巨集的後處理檢視)

  • 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++ 程式碼。 您可以移至 [類別檢視]、展開類型節點、展開 [衍生類型] 子資料夾,然後將這些類型拖曳至類別圖表,以顯示衍生類別。

如需多重類別繼承的詳細資訊,請參閱多重繼承多重基底類別

抽象類別

類別設計工具支援抽象類別 (也稱為「抽象基底類別」)。 這些是您永遠不會具現化的類別,而是從中衍生其他類別的類別。 使用本文件稍早<多重繼承>中的範例,您可能會將 Bird 類別具現化為個別物件,如下所示︰

int main()
{
   Bird sparrow;
   Bird crow;
   Bird eagle;
}

不過,您可能不想要將 Swimmer 類別具現化為個別物件。 您可能只要從中衍生其他類型的動物類別;例如,PenguinWhaleFish。 在此情況下,您可以將 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;
}

當您在類別圖表中顯示此程式碼時,類別設計工具會繪製一條從 FishSwimmer 的繼承線。

匿名類別

類別設計工具支援匿名類別。 「匿名類別類型」是未宣告識別碼的類別。 它們不能有建構函式或解構函式、不能當成引數傳遞至函式,而且不能從函式當成傳回值傳回。 您可以使用匿名類別,將類別名稱取代為 typedef 名稱,如下列範例所示︰

typedef struct
{
    unsigned x;
    unsigned y;
} POINT;

結構也可以是匿名的。 類別設計工具顯示匿名類別和結構的方式,與顯示對應類型相同。 雖然您可以宣告和顯示匿名類別和結構,但是類別設計工具不會使用您指定的標記名稱。 它會使用類別檢視所產生的名稱。 在類別檢視和類別設計工具中,類別或結構會顯示為稱為 __unnamed 的項目。

如需匿名類別的詳細資訊,請參閱匿名類別類型

範本類別

類別設計工具支援範本類別的視覺效果。 支援巢狀宣告。 下表顯示一些典型宣告。

Code 項目 類別設計工具檢視
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>

範本類別

下表顯示一些部分特製化範例。

Code 項目 類別設計工具檢視
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*>

範本類別

下表顯示部分特製化中的一些繼承範例。

Code 項目 類別設計工具檢視
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

類別

(指向類別 A)

C

類別

(指向類別 A)

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

Code 項目 類別設計工具檢視
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

類別

-> C<int>

C<T>

範本類別

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

Code 項目 類別設計工具檢視
template <class T>

class C {};

template<>

class C<int> {

class B {};

}

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

類別

->B

C<int>

類別

(B 包含在「巢狀類型」的類別 C 內)

C<T>

範本類別

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

Code 項目 類別設計工具檢視
template <class T>

class C {};

template<>

class C<int> {};

class A : C<int> {};

class D : C<float> {};
A

類別

->C<int>

C<int>

類別

C<T>

範本類別

D

類別

->C<float>
class B {

template <class T>

T min (const T &a, const T &b);

};
B

min <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 類型的詳細資訊,請參閱列舉

類別設計工具中的 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,圖形會有圓角和標籤「類別」。 針對 typedef struct,圖形會有方角和標籤「結構」

類別和結構中可宣告巢狀 typedefs。 在類別設計工具中,類別和結構圖形可將巢狀 typedef 宣告顯示為巢狀圖形。

Typedef 圖形支援右鍵功能表 (操作功能表) 上的 [顯示為關聯] 和 [顯示為集合關聯] 命令。

類別 typedef 範例

class B {};
typedef B MyB;

C++ class typedef in Class Designer

結構 typedef 範例

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

C++ struct typedef in Class Designer

未命名的 typedef

雖然您可以宣告沒有名稱的 typedef,但類別設計工具不會使用您指定的標籤名稱。 類別設計工具會使用類別檢視產生的名稱。 例如,下列宣告有效,但會以名為 __unnamed 的物件形式顯示在 [類別檢視] 和 [類別設計工具] 中:

typedef class coord
{
   void P(x,y);
   unsigned x;
   unsigned y;
};

注意

類別設計工具不會顯示來源類型是函式指標的 typedef。

了解 C++ 程式碼元素的限制

  • 在載入 C++ 專案時,[類別設計工具] 會以唯讀方式運作。 您可以變更類別圖,但是您無法將類別圖中的變更存回至原始程式碼。

  • [類別設計工具] 僅支援原生 C++ 語意。 針對編譯為受控程式碼的 C++ 專案,[類別設計工具] 只會視覺化屬於原生類型的程式碼項目。 因此,您可以將類別圖表新增至專案中,但是 [類別設計工具] 將不允許您視覺化 IsManaged 屬性設為 true 的項目 (也就是實值型別和參考型別)。

  • 針對 C++ 專案,[類別設計工具] 只會讀取類型的定義。 例如,假設您將類型定義於標頭檔 (.h) 中,並將其成員定義於實作檔 (.cpp) 中。 如果您在實作檔 (.cpp) 上叫用「檢視類別圖表」,[類別設計工具] 將不會顯示任何項目。 另舉一例,如果您在使用 #include 陳述式的 .cpp 檔上叫用「檢視類別圖表」,以包含其他檔案,但不包含任何實際類別定義,[類別設計工具] 也不會顯示任何項目。

  • IDL (.idl) 檔 (其中定義 COM 介面類型程式庫) 不會顯示在圖表中,除非它們編譯為原生 C++ 程式碼。

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

  • [類別設計工具] 不支援等位。 這是配置的記憶體僅足以供等位的最大資料成員使用之類別的特殊類型。

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

  • 如果專案沒有類型的正確參考,[類別設計工具] 即不會顯示在目前的專案以外定義的類型。

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

  • [類別設計工具] 無法顯示無效類型或衍生自無效類型的類型。

針對類型解析與顯示問題進行疑難排解

原始程式檔的位置

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

更新和效能問題

在 C++ 專案中,可能需要 30 到 60 秒,原始程式檔的變更才會出現在類別圖中。 此延遲也可能會導致 [類別設計工具] 擲回錯誤:選取範圍中找不到任何類型。 如果您收到這類錯誤,請在錯誤訊息中按一下 [取消],並等候程式碼項目出現在 [類別檢視] 中。 執行這項操作後,[類別設計工具] 即應能夠顯示類型。

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

類型解析問題

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

  • 類型所屬的專案或組件不是從包含類別圖的專案中參考的。 若要更正這個錯誤,請在包含類型的專案或組件中加入參考。 如需詳細資訊,請參閱管理專案中的參考

  • 類型不在正確的範圍內,因此 [類別設計工具] 無法找到它。 請確定您的程式碼未遺漏 usingimports#include 陳述式。 也請確定您未將該類型 (或相關類型) 從它最初建立所在的命名空間中移出。

  • 類型不存在 (或已標記為註解)。 若要更正這個錯誤,請確定您未將類型標記為註解或刪除類型。

  • 類型位於 #import 指示詞所參考的程式庫中。 可行的因應措施之一,是將產生的程式碼 (.tlh 檔) 手動加入至標頭檔中的 #include 指示詞。

  • 確定 [類別設計工具] 支援您所鍵入的類型。 請參閱 C++ 程式碼項目限制

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

  • 確定類型存在。 確定您未在無意中將原始程式檔標記為註解或刪除原始程式檔。

  • 嘗試解析類型。 類型所屬的專案或組件不是從包含類別圖的專案中參考的。 若要更正這個錯誤,請在包含類型的專案或組件中加入參考。 如需詳細資訊,請參閱管理專案中的參考

  • 確定類型位於正確的範圍內,讓類別設計工具能夠找到它。 確定程式碼未遺漏 usingimports#include 陳述式。 也請確定您未將該類型 (或相關類型) 從它最初建立所在的命名空間中移出。

提示

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