Frage

geerbt ich eine große Anwendung, die ursprünglich in C geschrieben wurde (aber in der Zwischenzeit eine Menge von C ++ wurde auch hinzugefügt). Aus historischen Gründen enthält die Anwendung eine Menge hohlraum Zeiger. Bevor Sie zu ersticken beginnen, lassen Sie mich erklären, warum dies geschehen ist.

Die Anwendung enthält viele verschiedene Datenstrukturen, aber sie sind in ‚Generika‘ Containern gelagert. Heute würde ich als Templat STL-Container für sie verwenden, oder ich würde alle Datenstrukturen eine gemeinsame Basisklasse geben, so dass der Behälter Zeiger auf die Basisklasse speichern kann, aber in der [gut?] Alten C Tagen war die einzige Lösung wirft den Struktur-Zeiger auf einen hohlraum Zeiger.

Darüber hinaus gibt es eine Menge Code, dass Werke auf diesem hohlraum Zeiger und Verwendungen sehr seltsame C-Konstruktionen zu emulieren Polymorphismus in C.

Ich bin Nacharbeiten nun die Anwendung, und versuchen, loszuwerden, die hohlraum Zeiger zu bekommen. eine gemeinsame Basis-Klasse für alle Strukturen der Daten hinzuzufügen ist nicht so schwer (wenige Tage Arbeit), aber das Problem ist, dass der Code voller Konstruktionen ist wie unten gezeigt.

Dies ist ein Beispiel dafür, wie Daten gespeichert werden:

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

Dies ist ein Beispiel dafür, wie Daten abgerufen wieder:

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

Ich möchte eigentlich alle den hohlraum Zeiger mit einigem Smart-Pointer (Referenzzählung) ersetzen, aber ich kann nicht einen Trick zu automatisieren (oder zumindest) hilfst mir alle Würfe loszuwerden finden und von hohlraum Zeiger.

Alle Tipps, wie Sie zu finden, ersetzen oder interact in jede möglichen Weise mit diesen Umwandlungen?

War es hilfreich?

Lösung 3

Anscheinend gibt es keine automatisierte Art und Weise / Trick zu konvertieren oder alle Verwendungen von hohlraum Zeigern zu finden. Ich werde die manuelle Arbeit verwenden, müssen alle hohlraum Zeiger zu finden, in Kombination mit PC-Lint, die Fehler geben, wenn es eine falsche Konvertierung ist.

Fall geschlossen.

Andere Tipps

  

Ich möchte wirklich alle ersetzen   hohlraum Zeiger mit einigen Smart-Pointer   (Referenzzählung), aber ich kann nicht finden   ein Trick (oder zumindest) helfen zu automatisieren   um mich zu allen Würfen befreien und   von hohlraum Zeiger.

Eine solche automatisierte Refactoring trägt viele Risiken.

Ansonsten manchmal mag ich Tricks spielen, indem sie die Template-Funktionen solcher void * Funktionen machen aus. Das:

void storeData (int datatype, void *data);

wird:

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

Auf den ersten Vorlage implementieren, indem Sie einfach die ursprüngliche (umbenannt) Funktion Verpackung und die Typen zu konvertieren. Das könnte Ihnen ermöglichen, potenzielle Probleme zu sehen -. Bereits durch einfaches Zusammenstellen der Code

Sie brauchen wahrscheinlich nicht der Abgüsse loswerden zu gemeinsamen Zeiger zu verwenden.

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

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

Natürlich setzt dies voraus, dass Sie nicht erwarten, dass die gleichen Zeiger über Anrufe zu speichern teilen / holen. Mit anderen Worten, myCustomer1 und myCustomer2 nicht die gleichen Zeiger teilen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top