2010-06-11 24 views
6

Orijinal olarak C dilinde yazılmış büyük bir uygulama devraldım (ancak bu süre zarfında C++ da eklenmiştir). Tarihsel nedenlerden dolayı, uygulama çok sayıda boşluk işaretçisi içeriyor. Boğulmaya başlamadan önce, bunun neden yapıldığını açıklamama izin ver.Boşluk işaretçilerinden nasıl kurtululur

uygulama birçok farklı veri yapılarını içerir, ancak bunlar bir 'genel' kaplarda depolanır. Günümüzde şablonlar için templated STL kapsayıcılar kullanacağım, ya da tüm veri yapılarını ortak bir taban sınıfı verecektim, bu sayede konteynırlar temel sınıfa saklayabilir, fakat [iyi?] Eski C günlerinde tek çözüm Yapı işaretçisini bir boşluk işaretçisine çevirmek.

Ayrıca, orada bu boşluk sayılık çalışır kod bir sürü olduğunu ve kurtulmak için C

Şimdi uygulamayı reworking ve çalışıyorum polimorfik olduğu taklit çok garip C yapılar kullanır boşluk-işaretçiler. Tüm veri yapılarına ortak bir taban sınıfının eklenmesi o kadar da zor değildir (birkaç günlük çalışma), fakat problem, kodun aşağıda gösterilen yapılarla dolu olmasıdır.

Bu

verilerin depolandığı nasıl bir örnektir:

void storeData (int datatype, void *data); // function prototype 
... 
Customer *myCustomer = ...; 
storeData (TYPE_CUSTOMER, myCustomer); 

Bu nasıl veri örneği tekrar getirilirse:

Customer *myCustomer = (Customer *) fetchData (TYPE_CUSTOMER, key); 

Aslında tüm boşluk-işaretçileri değiştirmek istiyor Bazı akıllı işaretçi (referans sayılır), ama otomatik olarak (veya en azından) otomatik olarak tüm oyuncu kadrolarından ve boşluk işaretçilerinden kurtulmak için bana yardımcı olacak bir hile bulamıyorum. Yerini bulmak veya bu dönüşümleri ile herhangi bir şekilde etkileşim konusunda

Herhangi bir ipucu?

+1

Bunu otomatik olarak yapmanın bir hile olmadığını düşünüyorum. Birbiri ardına ... – INS

+0

Mağaza ve getirme işlevleri 'veri türü' ile ne yapar? Yapının kör bir kopyasını mı yapıyorlar yoksa sadece o boşluk işaretçisini mi saklıyorlar? –

+0

Veri türü, aynı veri türündeki tüm verileri bir arada saklamak ve veri türlerinde bazı 'ortak' mantığı yürütmek için kullanılır. Söylendiği gibi, düz C'de polimorfizm öykünür. – Patrick

cevap

0

Görünüşe göre, dönüştürmek veya boşluk sayılık tüm kullanımlarını bulmak için otomatik bir yolu/hile yoktur.Yanlış bir dönüşüm olduğunda hata verecek PC-Lint ile birlikte tüm boşluk işaretlerini bulmak için manuel emeği kullanmalıyım.

Kasa kapalı.

0

Paylaşılan işaretçiyi kullanmak için muhtemelen dökümlerden kurtulmanıza gerek yoktur. Tabii

storeData(TYPE_CUSTOMER, myCustomer1->get()); 

shared_ptr<Customer> myCustomer2(reinterpret_cast<Customer*>fetchData(TYPE_CUSTOMER, "???"); 

, bu getirme/saklamak için çağrıları arasında aynı göstergeyi paylaşmak için beklemeyin varsayar. Başka bir deyişle, myCustomer1 ve myCustomer2 aynı işaretçiyi paylaşmaz.

7

Aslında bazı akıllı-pointer (referans sayılan) ile tüm boşluk-işaretçileri değiştirmek istiyor, ama ben otomatik hale getirmek bir hile bulmak (veya en azından) almak için bana yardım edemez void-pointer'lardan 'a kadar tüm oyunculardan kurtulun.

Böyle otomatikleştirilmiş üstlenmeden birçok riskleri taşımaktadır.

Aksi takdirde, bazen böyle hükümsüz * fonksiyonların şablon işlevlerini yaparak hile oynamak ister. Yani:

void storeData (int datatype, void *data); 

olur: Birincisi sadece orijinal (değiştirildi) işlevini sarılması ve türleri dönüştürerek şablonu uygulamak

template <class T> 
void storeData (int datatype, T *data); 

anda. Bu, potansiyel sorunları görmenize izin verebilir - sadece kodu derleyerek.