Sınıf Tasarımcısı'nda C++ koduyla çalışma

Sınıf Tasarımcısı , projenizdeki kod öğelerinin görsel bir gösterimini sağlayan sınıf diyagramı olarak adlandırılan bir görsel tasarım yüzeyi görüntüler. Bir projedeki sınıfları ve diğer türleri tasarlamak ve görselleştirmek için sınıf diyagramlarını kullanabilirsiniz.

Sınıf Tasarımcısı aşağıdaki C++ kod öğelerini destekler:

  • Sınıf (birden çok devralma ilişkisine sahip olması dışında yönetilen bir sınıf şekline benzer)

  • Anonim sınıf (Class View tarafından anonim tür için oluşturulan adı görüntüler)

  • Şablon sınıfı

  • Yapı

  • enum

  • Makro (makronun işlenen son görünümünü görüntüler)

  • Tür Tanımlayıcı

Uyarı

Bu, modelleme projesinde oluşturabileceğiniz UML sınıf diyagramıyla aynı değildir. Daha fazla bilgi için bkz. UML Sınıf Diyagramları: Referans.

Sınıf Tasarımcısı'nda C++ sınıfları

Sınıf Tasarımcısı , C++ sınıflarını destekler ve yerel C++ sınıflarını Visual Basic ve C# sınıf şekilleriyle aynı şekilde görselleştirir, ancak C++ sınıflarının birden çok devralma ilişkisi olabilir. Sınıfta daha fazla alan ve yöntem göstermek için sınıf şeklini genişletebilir veya alandan tasarruf etmek için daraltabilirsiniz.

Uyarı

Sınıf Tasarımcısı birleşimleri desteklemez (ayrılan belleğin yalnızca birleşimin en büyük veri üyesi için gereken miktar olduğu özel bir sınıf türüdür).

Basit devralma

Bir sınıf diyagramına birden fazla sınıf sürüklediğinizde ve sınıfların bir sınıf devralma ilişkisi olduğunda, bunları bir ok bağlar. Ok, temel sınıfın yönünü gösterir. Örneğin, aşağıdaki sınıflar bir sınıf diyagramında görüntülendiğinde, bunları B'den A'ya işaret eden bir ok bağlar:

class A {};
class B : A {};

Ayrıca, sınıf diyagramına yalnızca B sınıfını sürükleyebilir, B için sınıf şekline sağ tıklayabilir ve ardından Temel Sınıfları Göster'e tıklayabilirsiniz. Bu, temel sınıfını görüntüler: A.

Birden çok devralma

Sınıf Tasarımcısı , birden çok sınıf devralma ilişkilerinin görselleştirmesini destekler. Türetilmiş bir sınıfın birden fazla temel sınıf özniteliği olduğunda birden çok devralma kullanılır. Birden çok devralma örneği aşağıda verilmiştir:

class Bird {};
class Swimmer {};
class Penguin : public Bird, public Swimmer {};

Sınıf diyagramına birden fazla sınıf sürüklediğinizde ve sınıfların birden çok sınıflı devralma ilişkisi olduğunda, bunları bir ok bağlar. Ok, temel sınıfların yönünü gösterir.

Bir sınıf şekline sağ tıklayıp Temel Sınıfları Göster'e tıklanması, seçilen sınıfın temel sınıflarını görüntüler.

Uyarı

Türetilmiş Sınıfları Göster komutu C++ kodu için desteklenmez. Türetilmiş sınıfları Sınıf Görünümü'ne giderek, tür düğümünü genişleterek, Türetilmiş Türler alt klasörünü genişleterek ve sonra bu türleri sınıf diyagramına sürükleyerek görüntüleyebilirsiniz.

Birden çok sınıf devralma hakkında daha fazla bilgi için bkz Birden Çok Devralma ve Birden Çok Temel Sınıf.

Soyut sınıflar

Sınıf Tasarımcısı soyut sınıfları ("soyut temel sınıflar" olarak da adlandırılır) destekler. Bunlar, hiçbir zaman örneklemeyeceğiniz, ancak diğer sınıfları türetebileceğiniz sınıflardır. Bu belgenin önceki bölümlerinde yer alan "Birden Çok Devralma" örneğini kullanarak, sınıfı aşağıdaki gibi tek tek nesneler olarak başlatabilirsiniz Bird :

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

Ancak, Swimmer sınıfını bireysel nesneler olarak örneklemeyi amaçlamayabilirsiniz. Yalnızca diğer türdeki hayvan sınıflarını türetmek isteyebilirsiniz, örneğin, Penguin, Whaleve Fish. Bu durumda, sınıfı soyut bir temel sınıf olarak bildirirsiniz Swimmer .

Bir sınıfı soyut olarak bildirmek için anahtar sözcüğünü abstract kullanabilirsiniz. Soyut olarak işaretlenmiş veya soyut bir sınıfa dahil edilen üyeler sanaldır ve soyut sınıftan türetilen sınıflar tarafından uygulanmalıdır.

class Swimmer abstract
{
   virtual void swim();
   void dive();
};

En az bir saf sanal işlev ekleyerek bir sınıfı soyut olarak da bildirebilirsiniz:

class Swimmer
{
   virtual void swim() = 0;
   void dive();
};

Bu bildirimler bir Sınıf Diyagramı'nda görüntülendiğinde, sınıf adı Swimmer ve saf sanal işlevi swim, Soyut Sınıf gösterimiyle birlikte, soyut sınıf şeklinde italik olarak görüntülenir. Soyut sınıf türü şeklinin normal bir sınıfla aynı olduğuna dikkat edin, ancak kenarlığı noktalı bir çizgidir.

Soyut bir temel sınıftan türetilen bir sınıf, temel sınıftaki her saf sanal işlevi geçersiz kılmalıdır veya türetilmiş sınıfın örneği oluşturulamaz. Bu nedenle, örneğin, bir Fish sınıfından Swimmer sınıf türetirseniz, swim yöntemini Fish geçersiz kılmanız gerekir.

class Fish : public Swimmer
{
   void swim(int speed);
};

int main()
{
   Fish guppy;
}

Bu kodu bir Sınıf Diyagramı'nda görüntülendiğinde, Sınıf Tasarımcısı öğesinden Fish öğesine Swimmerbir devralma çizgisi çizer.

Anonim sınıflar

Sınıf Tasarımcısı anonim sınıfları destekler. Anonim sınıf türleri , tanımlayıcı olmadan bildirilen sınıflardır. Oluşturucu veya yıkıcı içeremezler, işlevlere argüman olarak geçirilemezler ve işlevlerden dönüş değeri olarak döndürülemezler. Aşağıdaki örnekte olduğu gibi, bir sınıf adını typedef adıyla değiştirmek için anonim bir sınıf kullanabilirsiniz:

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

Yapılar anonim de olabilir. Sınıf Tasarımcısı , anonim sınıfları ve yapıları ilgili türle aynı şekilde görüntüler. Anonim sınıfları ve yapıları bildirebilir ve görüntüleyebilirsiniz, ancak Sınıf Tasarımcısı belirttiğiniz etiket adını kullanmaz. Sınıf Görünümü'nde oluşturulan adı kullanır. Sınıf veya yapı, Sınıf Görünümü ve Sınıf Tasarımcısı'nda__unnamed adlı bir öğe olarak görünür.

Anonim sınıflar hakkında daha fazla bilgi için bkz. Anonim Sınıf Türleri.

Şablon sınıfları

Sınıf Tasarımcısı , şablon sınıflarının görselleştirmesini destekler. İç içe bildirimler desteklenir. Aşağıdaki tabloda bazı tipik bildirimler gösterilmektedir.

Kod öğesi Sınıf Tasarımcısı görünümü
template <class T>

class A {};
A<T>

Şablon Sınıfı
template <class T, class U>

class A {};
A<T, U>

Şablon Sınıfı
template <class T, int i>

class A {};
A<T, i>

Şablon Sınıfı
template <class T, template <class K> class U>

class A {};
A<T, U>

Şablon Sınıfı

Aşağıdaki tabloda kısmi özelleştirmeye ilişkin bazı örnekler gösterilmektedir.

Kod öğesi Sınıf Tasarımcısı görünümü
template<class T, class U>

class A {};
A<T, U>

Şablon Sınıfı
template<class T>

class A<T, T> {};
A<T, T>

Şablon Sınıfı
template <class T>

class A<T, int> {};
A<T, int>

Şablon Sınıfı
template <class T1, class T2>

class A<T1*, T2*> {};
A<T1*, T2*>

Şablon Sınıfı

Aşağıdaki tabloda kısmi özelleştirmede devralma örnekleri gösterilmektedir.

Kod öğesi Sınıf Tasarımcısı görünümü
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>

Şablon Sınıfı

B

Class

(Sınıf A'ya işaret eden)

C

Class

(Sınıf A'ya işaret eden)

Aşağıdaki tabloda kısmi özelleştirme şablonu işlevlerinin bazı örnekleri gösterilmektedir.

Kod öğesi Sınıf Tasarımcısı görünümü
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 aşırı yüklemesi)
template <class T1>

class A {

template <class T2>

class B {};

};

template<> template<>

class A<type>::B<type> {};
A<T1>

Şablon Sınıfı

B<T2>

Şablon Sınıfı

(B, İç İçe Türler altında A sınıfı içerisinde yer alır)
template <class T>

class C {};

class A : C<int> {};
A

Class

-> C<int>

C<T>

Şablon Sınıfı

Aşağıdaki tabloda şablon devralma ile ilgili bazı örnekler gösterilmektedir.

Kod öğesi Sınıf Tasarımcısı görünümü
template <class T>

class C {};

template<>

class C<int> {

class B {};

}

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

Class

->B

C<int>

Class

(B, C sınıfının İç İçe Türler altında yer alır)

C<T>

Şablon Sınıfı

Aşağıdaki tabloda kurallı özel sınıf bağlantısının bazı örnekleri gösterilmektedir.

Kod öğesi Sınıf Tasarımcısı görünümü
template <class T>

class C {};

template<>

class C<int> {};

class A : C<int> {};

class D : C<float> {};
A

Class

->C<int>

C<int>

Class

C<T>

Şablon Sınıfı

D

Class

->C<float>
class B {

template <class T>

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

};
B

min <T>

Sınıf Tasarımcısı'nda C++ numaralandırmaları

Sınıf Tasarımcısı C++ enum ve scoped enum class türleri destekler. Aşağıda bir örnek verilmiştir:

enum CardSuit {
   Diamonds = 1,
   Hearts = 2,
   Clubs = 3,
   Spades = 4
};

// or...
enum class CardSuit {
   Diamonds = 1,
   Hearts = 2,
   Clubs = 3,
   Spades = 4
};

Sınıf diyagramındaki C++ numaralandırma şekli, yapı şekli gibi görünür ve çalışır, ancak etiket Enum veya Enum sınıfını okur, mavi yerine pembedir ve sol ve üst kenar boşluklarında renkli bir kenarlık vardır. Hem numaralandırma şekillerinin hem de yapı şekillerinin kare köşeleri vardır.

türünü kullanma enum hakkında daha fazla bilgi için bkz. Numaralandırmalar.

Sınıf Tasarımcısı'nda C++ tür tanımları

Typedef deyimleri, bir ad ile temel alınan türü arasında bir veya daha fazla dolaylı katman oluşturur. Sınıf Tasarımcısı , anahtar sözcüğüyle typedefbildirilen C++ tür tanımı türlerini destekler, örneğin:

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

Ardından örneği bildirmek için bu türü kullanabilirsiniz:

COORD OriginPoint;

Sınıf ve yapı şekilleri

Sınıf Tasarımcısı'nda bir C++ tür tanımı, tür tanımında belirtilen türün şekline sahiptir. Kaynak typedef class bildirirse, şeklin köşeleri yuvarlatılmış ve etiketi Sınıf olur. typedef struct için, şeklin kare köşeleri vardır ve etiketi Struct şeklindedir.

Sınıfların ve yapıların içinde iç içe tür tanımları bildirilebilir. Sınıf Tasarımcısı'nda, sınıf ve yapı şekilleri iç içe geçmiş typedef bildirimlerini iç içe yerleştirilmiş şekiller olarak gösterebilir.

Typedef şekilleri, sağ tıklama menüsünde (bağlam menüsü) İlişkilendirme Olarak Göster ve Koleksiyon İlişkilendirmesi Olarak Göster komutlarını destekler.

Sınıf türü tanımı örneği

class B {};
typedef B MyB;

Sınıf Tasarımcısı'nda C++ sınıf tür tanımı

Yapı türü tanımı örneği

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

Sınıf Tasarımcısı'nda C++ yapı tür tanımı

Adsız tür tanımları

Bir typedef'i ad olmadan bildirebilmenize rağmen, Sınıf Tasarımcısı belirttiğiniz etiket adını kullanmaz. Sınıf Tasarımcısı, Sınıf Görünümü'nde oluşturulan adı kullanır. Örneğin, aşağıdaki bildirim geçerlidir, ancak Sınıf Görünümü ve Sınıf Tasarımcısı'nda__unnamed adlı bir nesne olarak görünür:

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

Uyarı

Sınıf Tasarımcısı , kaynak türü işlev işaretçisi olan tür tanımlarını görüntülemez.

C++ kod öğeleriyle ilgili sınırlamalar hakkında bilgi edinin

  • Bir C++ projesi yüklendiğinde , Sınıf Tasarımcısı salt okunur bir şekilde çalışır. Sınıf diyagramını değiştirebilirsiniz, ancak değişiklikleri sınıf diyagramından kaynak koda geri kaydedemezsiniz.

  • Sınıf Tasarımcısı yalnızca yerel C++ semantiğini destekler. Yönetilen kodda derlenen C++ projeleri için Sınıf Tasarımcısı yalnızca yerel türlerdeki kod öğelerini görselleştirir. Bu nedenle, bir projeye sınıf diyagramı ekleyebilirsiniz, ancak Sınıf Tasarımcısı özelliğin IsManaged ayarlandığı true öğeleri (değer türleri ve başvuru türleri) görselleştirmenize izin vermez.

  • C++ projeleri için Sınıf Tasarımcısı yalnızca türün tanımını okur. Örneğin, üst bilgi (.h) dosyasında bir tür tanımladığınız ve üyelerini bir uygulama (.cpp) dosyasında tanımladığınız varsayılır. Uygulama (.cpp) dosyasında "Sınıf Diyagramını Görüntüle" çağrısı yaparsanız, Sınıf Tasarımcısı hiçbir şey görüntülemez. Başka bir örnek olarak, diğer dosyaları eklemek için bir deyim kullanan ancak gerçek sınıf tanımları içermeyen bir #include .cpp dosyasında "Sınıf Diyagramını Görüntüle" çağrısı yaparsanız, Sınıf Tasarımcısı yine hiçbir şey görüntülemez.

  • COM arabirimlerini ve tür kitaplıklarını tanımlayan IDL (.idl) dosyaları, yerel C++ koduna derlenmedikleri sürece diyagramlarda görüntülenmez.

  • Sınıf Tasarımcısı genel işlevleri ve değişkenleri desteklemez.

  • Sınıf Tasarımcısı birlikleri desteklemez. Bu, ayrılan belleğin yalnızca birleşimin en büyük veri üyesi için gereken miktar olduğu özel bir sınıf türüdür.

  • Sınıf Tasarımcısı ve intgibi char temel veri türlerini görüntülemez.

  • Proje bu türlere doğru başvurulara sahip değilse, Sınıf Tasarımcısı geçerli proje dışında tanımlanan türleri görüntülemez.

  • Sınıf Tasarımcısı iç içe türleri görüntüleyebilir, ancak iç içe geçmiş bir türle diğer türler arasındaki ilişkileri görüntülemez.

  • Sınıf Tasarımcısı geçersiz olan veya void türünden türetilen türleri görüntüleyemez.

Tür çözümleme ve görüntüleme sorunlarını giderme

Kaynak dosyaların konumu

Sınıf Tasarımcısı kaynak dosyaların konumunu izlemez. Bu nedenle, proje yapınızı değiştirir veya projenizdeki kaynak dosyaları taşırsanız, Sınıf Tasarımcısı türün izini kaybedebilir (özellikle bir tür tanımı, temel sınıflar veya ilişkilendirme türlerinin kaynak türü). Sınıf Tasarımcısı bu türü görüntüleyemiyor gibi bir hata alabilirsiniz. Bunu yaparsanız, değiştirilen veya yeniden konumlandırılan kaynak kodunu yeniden görüntülemek için sınıf diyagramına yeniden sürükleyin.

Güncelleştirme ve performans sorunları

C++ projelerinde, kaynak dosyadaki bir değişikliğin sınıf diyagramında görünmesi 30-60 saniye sürebilir. Bu gecikme , Sınıf Tasarımcısı'nınseçimde hiçbir tür bulunamadı hatasını oluşturmasına da neden olabilir. Bunun gibi bir hata alırsanız, hata iletisinde İptal'e tıklayın ve kod öğesinin Sınıf Görünümü'nde görünmesini bekleyin. Bunu yaptıktan sonra , Sınıf Tasarımcısı türü görüntüleyebilmelidir.

Sınıf diyagramı kodda yaptığınız değişikliklerle güncelleştirilmezse diyagramı kapatıp yeniden açmanız gerekebilir.

Tür çözümleme sorunları

Sınıf Tasarımcısı türleri aşağıdaki nedenlerle çözümleyemeyebilir:

  • Tür, sınıf diyagramını içeren projeden referans verilmeyen bir proje veya bütünleştirmede yer almaktadır. Bu hatayı düzeltmek için türü içeren projeye veya derlemeye bir başvuru ekleyin. Daha fazla bilgi için bkz. Projedeki başvuruları yönetme.

  • Tür doğru kapsamda olmadığından Sınıf Tasarımcısı bunu bulamıyor. Kodun bir using, importsveya #include deyimi eksik olmadığından emin olun. Ayrıca türü (veya ilgili bir türü) özgün olarak bulunduğu ad alanının dışına taşımadığınızdan emin olun.

  • Tür mevcut değil (veya yorum satırı olarak bırakıldı). Bu hatayı düzeltmek için açıklama eklemediğinizden veya türü silmediğinizden emin olun.

  • Tür, #import yönergesi tarafından başvurulan bir kitaplıkta bulunur. Olası bir geçici çözüm, oluşturulan kodu (.tlh dosyası) üst bilgi dosyasına bir #include yönergesine el ile eklemektir.

  • Sınıf Tasarımcısı'nın girdiğiniz türü desteklediğinden emin olun. Bkz. C++ kod öğeleri için sınırlamalar.

Tür çözümleme sorunu için büyük olasılıkla göreceğiniz hata, '<element>' sınıf diyagramındaki bir veya daha fazla şekil için Kod bulunamadı hatasıdır. Bu hata iletisi kodunuzun hatalı olduğunu belirtmez. Yalnızca sınıf tasarımcısının kodunuzu görüntüleyemediğini gösterir. Aşağıdaki ölçüleri deneyin:

  • Türün mevcut olduğundan emin olun. Kaynak kodu istemeden açıklama eklemediğinizden veya silmediğinizden emin olun.

  • Türü çözümlemeyi deneyin. Tür, sınıf diyagramını içeren projeye referans verilmemiş bir projede veya derlemede olabilir. Bu hatayı düzeltmek için, türü içeren projeye veya derlemeye bir referans ekleyin. Daha fazla bilgi için bkz. Projedeki başvuruları yönetme.

  • Sınıf Tasarımcısı'nın bulabilmesi için türün doğru kapsamda olduğundan emin olun. Kodun bir using, importsveya #include deyimi eksik olmadığından emin olun. Ayrıca türü (veya ilgili bir türü) özgün olarak bulunduğu ad alanının dışına taşımadığınızdan emin olun.

Tavsiye

Ek sorun giderme bilgileri için bkz . Sınıf Tasarımcısı hataları.