SORU
10 EYLÜL 2009, PERŞEMBE


Nasıl C sınıfı uygulamak mı?

Sanırım kullanmak zorunda C (C veya nesne tabanlı Derleyiciler) ve ben de değil, dinamik hafıza ayırma, ne bazı teknikler kullanabilirim uygulamak için bir sınıf, ya da iyi bir yaklaşım bir sınıf? Her zaman iyi bir fikir izole etmek için "sınıf" için ayrı bir dosya mı? Derlemek için önce sabit bir örneği veya her bir nesne için referans tanımlama bile sabit bir sayı kabul ederek belleğine önceden ayır edebiliriz varsayalım. (Değişir) ve her biri için en iyi yöntemi uygulamak önermek ihtiyacınız olacak hakkında varsayımlar yapmak için çekinmeyin.

Kısıtlamalar:

  • C ve OOP kullanmak zorundayım bir kod yazıyorum çünkü sistemi gömülü, ve derleyici ve kod Bankası C. hazır olduğunu
  • Dinamik bellek ayırma yok yeterli bellek yok çünkü makul tükendi olmayacak varsaymak biz dinamik olarak tahsis başlatın .
  • Birlikte çalıştığımız Derleyiciler işlev işaretçileri ile bir sorunum yok

CEVAP
10 EYLÜL 2009, PERŞEMBE


Tam olarak bağlıdır "nesne yönelimli" özellik seti var. bu Eğer ve/veya sanal metotları aşırı yükleme gibi şeylere ihtiyacınız varsa, muhtemelen yapılarda işlev işaretçileri eklemek gerekir:

typedef struct {
  float (*computeArea)(const ShapeClass *shape);
} ShapeClass;

float shape_computeArea(const ShapeClass *shape)
{
  return shape->computeArea(shape);
}

Bu bir sınıf uygulamak, "" temel sınıf ve uygun bir işlev uygulama: . devralma izin vermez

typedef struct {
  ShapeClass shape;
  float width, height;
} RectangleClass;

static float rectangle_computeArea(const ShapeClass *shape)
{
  const RectangleClass *rect = (const RectangleClass *) shape;
  return rect->width * rect->height;
}

Tabii ki bunun da işlev işaretçisi doğru ayarlanmış olduğundan emin kılan bir kurucu, uygulamak gerekir. Normalde dinamik olarak örnek için bellek ayrılamadı ama arayan bunu da sağlayabilirsiniz:

void rectangle_new(RectangleClass *rect)
{
  rect->width = rect->height = 0.f;
  rect->shape.computeArea = rectangle_computeArea;
}

Eğer birkaç farklı markalar isterseniz, "" işlev adları, birden fazla rectangle_new() fonksiyon: . süslemek gerekir

void rectangle_new_with_lengths(RectangleClass *rect, float width, float height)
{
  rectangle_new(rect);
  rect->width = width;
  rect->height = height;
}

Burada temel bir örnek kullanımını gösteren:

int main(void)
{
  RectangleClass r1;

  rectangle_new_with_lengths(&r1, 4.f, 5.f);
  printf("rectangle r1's area is %f units square\n", shape_computeArea(&r1));
  return 0;
}

Bu size bazı fikirler, az verir umarım. C başarılı ve zengin bir nesne yönelimli bir çerçeve, boş boş içine GObject kütüphane bak.

Ayrıca açık "genellikle bulmak istiyorum daha biraz daha esnek olan" yukarıda modellenmiş, her nesne kendi yöntemi vardır işaretçiler C . sınıf var unutmayın Ayrıca, bellek maliyeti. Bu uzak class bir yapıda yöntemi işaretçileri doldurma alabilir ve başvuru için her nesne örneği için bir yol bulmuş bir sınıf.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Caroline Saquet

    Caroline Saq

    1 EKİM 2011
  • RickardRick

    RickardRick

    9 Mart 2007
  • Ryan Ha

    Ryan Ha

    9 NİSAN 2006