2016-03-30 31 views
0

Bu konuyla ilgileniyorum. Bir kütüphane house.h, bir kütüphane roof.h içerir. Ayrıca bir kütüphane roof.h içeren bir car.h kütüphanesi var.INHERITANCE LIBRARY

Kütüphane roof.h sonraki içerir (şimdiye kadar bir rahatlama açıklamaya olarak kullanan tek yazılı) içerir, örneğin:

Şimdi
//this is only for the house.h` 
include tile.h 
include beam.h 
include form_roof_house.h 
//this is only for the car.h 
include sheet_metal.h 
include form_roof_car.h 
include modular.h //, etc. 

, sorularım olduğunu, bu benim kütüphane roof.h bir yol olup olmadığını Burada hangi kütüphanenin yer aldığını bilir, kütüphanemde roof.h olduğunu bilirim. Teşekkürler! iki kez dahil edilmeyecektir yani

+0

Yalnızca "house.h" veya "car.h" ifadelerini kullanıyorsanız, bunları "roof.h" şeklinde değil, doğrudan "house.h" veya "car.h" dizinlerinde kullanmamalısınız. "Üst" başlık dosyasına sahip olmak, her yerde paylaşmak istediğiniz ortak üstbilgiler/kodlarınız olduğunda iyidir. – Holt

+0

Bu dosyalar, kitaplıklar değil, başlıklardır. Bir başlık, derleyiciye bilgi sağlamak için kaynak dosyalara (veya diğer başlıklara) eklenen bir metin dosyasıdır. Bir kitaplık, bir yürütülebilir dosya oluşturmak için, bağlayıcınız tarafından işlenebilen nesne dosyaları ile birlikte programınıza özgü nesne dosyalarıdır. Gerçekten de # include include ifadelerini doğru olarak göstermelisiniz. Başlıklar olarak göründükleri için kafanız karıştıysa, kodun görünmesini istediğiniz gibi yazmanız (önizlemeyi yoksaymanız), ardından tüm kodu seçmeniz ve düzenlemenin üstündeki ** '{}' ** düğmesini kullanmanız gerekir. Kutu. –

+0

Üzgünüz; Burada yeniyim ve sorularım sadece bir örnek oldu. Şimdi ihtiyacım olan şeyi sunacağım. Üç fazlı AC motoru kontrol etmek için tek bir gömülü sistem geliştirdim. 44 kütüphane yaptım ve her kütüphanede bir şeyler var. HAL sürücüsü en düşük sürücüyü içerir, daha sonra APP sürücüsü dahil, HAL sürücüsünü içerir. Ehh, şimdi bunu düşünüyorum, tüm 44 kütüphanede yer alacak tek bir evrensel kütüphane geliştirmek, sadece o ve her bir kütüphane için bu kitaplıkların her biri bu evrensel kütüphanede yer alacaktır, fakat sadece sorun şu ki biliyorum, hangi kütüphane onu içeriyor. –

cevap

0

Başlık dosyaları başlık korumaları içermelidir. İki roof.h dosyasına mı saldırıyorsun? Aynı muhafızları paylaşırlarsa, ilki yüklenecektir. C the language without the preprocessor, dosyalar dahil edilmeden önce nelerin olup bittiği hakkında bilgi sahibi değildir. Çatı yalnızca jenerik çatı şeyleri gösterebilir bir "soyut temel sınıf" olması gerekir ve bu bir API sunar çünkü

-1

Programınız tasarımı, kusurludur. Bu nedenle, roof.h başlıkların hiçbirini içermemelidir. En önemlisi, ev çatısı ve araba çatısı arasında sıkı bir bağlantı olmamalı, bu hiç bir anlam ifade etmiyor ve bu ikisi de aynı programda mevcut olmayabilir.

Bunun yerine, çatıyı miras iki yeni sınıflar yapmak örnek roof_house ve roof_car için onları aramak gerekir. Bunların her biri roof.h.

Oradan, sen tasarım OO parçası olmak istiyorum nasıl seçici bağlı olarak birçok şekilde programı tasarımını uygulayabilir. OO tasarımını kullanmaya bile gerek yok (C programcıları genellikle bu konuda korkuyor) ancak yukarıda belirtilen dosya bağımlılıkları tutulmalıdır. sıkı bağlantı kaçınmak

o sağduyu uygulama hakkında olduğunu, OO özgü değildir: kaçınarak fail-basamaklı böcek vs vs bakım sorunları kaçınarak


olası bir tasarım işlev işaretçileri ile polimorfizm uygulamaktır:

roof.h

typedef struct roof_t roof_t; // forward declaration 

typedef void roof_func_t (const roof_t* roof); 

typedef struct 
{ 
    roof_func_t* init; 
    roof_func_t* draw; 
} roof_t; 

// functions for public interface: 

roof_t* roof_create (const roof_func_t* init, const roof_func_t* draw); 

void roof_draw (const roof_t* roof); 

ro

#include "roof.h" 

roof_t* roof_create (const roof_func_t* init, const roof_func_t* draw) 
{ 
    roof_t* roof = malloc(sizeof(roof_t)); 
    roof->init = init; 
    roof->draw = draw; 
    return roof; 
} 

void roof_draw (const roof_t* roof) 
{ 
    roof->draw(); 
} 

roof_house.h

#include "roof.h" 

void roof_house_init (const roof_t* roof); 
void roof_house_draw (const roof_t* roof); 

roof_house.c of.c

#include "roof_house.h" 

void roof_house_init (const roof_t* roof) 
{ 
    // whatever needs to go here 
} 

void roof_house_draw (const roof_t* roof) 
{ 
    // whatever needs to go here 
} 

main.c

Buelbette sadece kaba bir örnektir. Özel kapsülleme vb uygulanması gerekmektedir ve kalıtsal sınıfları kendi vb kendi üye değişkenlerini

Söylemeye gerek yok, her başlık dosyası her zaman başlık olmalıydı korumaları eklemek için bir yol gereksinim olabilir.

İlgili konular