Gönderen Konu: headerlar ve namespaceler [cpp]  (Okunma sayısı 7360 defa)

headerlar ve namespaceler [cpp]

« : 14.07.2006 20:06:48 »
Hızlı düğmeleri aç

anesthetic

İleti: 403

Çevrimdışı
  • ****
  • Sr. Member
    • Profili Görüntüle
    • http://resident.tr-demoscene.info/
Bir de tasarım sorusu gelsin.

şimdi elimde konuları ortak olan bir kaç tane class var. Örneğin Graph ve Matrix olsun. bunları Math adlı bi componentta birleştirdim.

Graph.h
Kod: [Seç]
namespace Math
{
 class Graph
 {
 // ...
 };
}

Matrix.h
Kod: [Seç]
namespace Math
{
 class Matrix
 {
 // ...
 };
}

Math.h
Kod: [Seç]
#include "Matrix.h"
#include "Graph.h"
#include "Complex.h"
// ...

Sonra Math.h'ı eklediğimde tüm bu elemanları Math:: altında kullanıyorum.

Sorun şu: Aynı classları Math altında görmek istemediğim başka projeler var, örneğin diğerlerinden tamamen ayrı olarak sadece Matrix classını alıp projemde Space:: altında görmek istiyorum. Bunu sağlamak için dosyaları şöyle düzenliyorum:

Graph.h
Kod: [Seç]
class Graph
 // ...
};

Matrix.h
Kod: [Seç]
class Matrix
{
 // ...
};

Math.h
Kod: [Seç]
namespace Math
{
 #include "Matrix.h"
 #include "Graph.h"
 #include "Complex.h"
 // ...
}

Artık ister Math.h'ı ekleyip Math altında bi kaç classa sahip olucam, ister Matrix.h'ı direk ekleyip kullanıcam istersem de Space gibi başka bi component vasıtasıyla ulaşıcam (istediğim bu). Ama sorun şu ki eğer Matrix.h içinde başka namespaceler varsa (örneğin stl inclusiondan gelen std gibi) her şey karışıyor. Math::std:: gibi namespace'e sahip oluyorum ve stl headerları derlenmiyor.

Böyle bi sorunun çözümü varsa ne güzel ama bi türlü bulamadım. Sorunu çözecek alternatifler ya da class ve componentlar için daha iyi bi tasarım mevcutsa öğrenmekten memnun kalırım.

headerlar ve namespaceler [cpp]

« Yanıtla #1 : 15.07.2006 15:52:25 »
Hızlı düğmeleri aç

nightlord

İleti: 1.085

Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.nightnetwork.org
matrix.h gibi bir header icinde #include olmamali...

yani normalde hic bir include dosyasindan baska dosya include edilmemeli. Bu dosyalar arasi compilation dependancy'yi cok artirir.

sadece math.h gibi bir grup header'i derleyip toplamak icin yapilmis headerlarda baska headerlar include edilmeli

eger herhangi bir include dosyasinda tanimlanan class icindeki attributelerden bazilarinin tipleri senin baska classlarinsa, (mesela cCamera classinda cMatrix tipinden attribute varsa) o zaman include sirasi uzerinden compile sorunlarinin cogu cozulebilir.

- genel olarak base classlarin derived classlardan once include edilmesi
- daha primitive classlarin, o classlardan compose edilmis classlardan once include edilmesi

son olarak da eger attribute referance veya pointer ise compilerin o tipin size'ini bilmesine gerek olmamasindan oturu forward declaration cozum olur. mesela

class cHede;

class cLolo {
public:
...
private:
cHede* mHede;
};

class cHede{
...
};

sirasi calisir.

headerlar ve namespaceler [cpp]

« Yanıtla #2 : 15.07.2006 17:13:44 »
Hızlı düğmeleri aç

anesthetic

İleti: 403

Çevrimdışı
  • ****
  • Sr. Member
    • Profili Görüntüle
    • http://resident.tr-demoscene.info/
hmm sadece classları toplayan headerda inclusion yapmak sorunları çözecek gibi gözüküyor. teşekkürler.