Doppelte Klassenname ignorieren
-
Hallo Leute,
habe da nen echtes Problem. Ich wollte meine Buttons aufpolieren und habe mir dafür CButtonst besorgt. Dort wird die original Button Klasse von MFC überschrieben. Das Problem ist nun das Buttonst auf CPoint (von afxwin.h) zugreift. Das Projekt an dem ich arbeite wurde von Maschinenbauern geschrieben und die haben ne eigene Klasse CPoint angelegt... jetzt weiß der Compiler natürlich nicht welche Klasse gemeint ist. Naja während die MFC Klasse nur einen aufruf hat, wird die eigene Klasse mehrere 100mal aufgerufen...Wie kriege ich CButtonst jetzt dazu auf die afxwin.h zuzugreifen und die eigene CPoint zu ignorieren?
Habe es schon mal mit namespace probiert...aber das kommt nicht so gut in einer MFC Klasse.
Vielen Dank.
-
Ich würde mal sagen: Strg+Shift+H!
Die hätten ihre Klasse nicht CPoint nennen sollen.
-
_matze schrieb:
Ich würde mal sagen: Strg+Shift+H!
Die hätten ihre Klasse nicht CPoint nennen sollen.
War das jetzt nen ernst gemeinter Rat oder nen Joke den ich nicht ganz kapiere?
Ich habe meinem Chef auch schon gesagt, dass das einfach nen Unding ist...aber die haben da so einigen Mist verzapft. Ich wusste vorher gar nicht wie schlecht C++ Code aussehen kann.

Naja aber es gibt leider zuviele Verweiße auf die selbsterstellte CPoint Klasse, als das ich wirklich in betracht ziehen könnte sie umzubennen. Das wäre nen riesen Aufwand, an dem ich aber wohl nicht vorbei kommen werde, wenn ich nicht herausfinde wie man auf die afxwin direkt zugreift!Aber tortzdem schon mal danke für die Anteilnahme

-
Naja aber es gibt leider zuviele Verweiße auf die selbsterstellte CPoint Klasse, als das ich wirklich in betracht ziehen könnte sie umzubennen. Das wäre nen riesen Aufwand, an dem ich aber wohl nicht vorbei kommen werde, wenn ich nicht herausfinde wie man auf die afxwin direkt zugreift!
Das wäre garkein grosser Aufwand, wenn du die nötigen Tools dazu verwendest.
Wenn du sicher sein kannst dass "CPoint" nicht in irgendwelchen Strings vorkommt, bzw. an irgendwelchen Stellen wo es nicht geändert werden darf, dann machst du das einfach mit "replace in files" (Studio 2003 kann das, wenn du noch mit VC++ 6.0 arbeitest nimm halt irgendeinen Freeware Texteditor der das kann).
Ansonsten nimm ein Tool wie Visual Assist X (http://www.wholetomato.com/). Das kostet zwar Geld, aber nicht allzuviel, und es macht sich einigermassen schnell bezahlt (durch Zeitersparnis). Gerade wenn man viel grausig schlechten Code hat.
Davon abgesehen: steck doch einfach den ganzen Code deiner Firma in einen Namespace (sollte man sowieso machen). Der Aufwand dafür beschränkt sich auf das Einfügen von wenigen Zeilen an der richtigen Position in jedem (eigenen) Source-File. Wenn es nicht gerade um Tausende oder Zigtausende eigene Source-Files geht ist das kein allzugrosses Ding.
MFC Dateien zu ändern ist auf jeden Fall ein Unding, und es würde auch erfordern dass du die MFC neu compilierst.
-
hustbaer schrieb:
Davon abgesehen: steck doch einfach den ganzen Code deiner Firma in einen Namespace (sollte man sowieso machen). Der Aufwand dafür beschränkt sich auf das Einfügen von wenigen Zeilen an der richtigen Position in jedem (eigenen) Source-File. Wenn es nicht gerade um Tausende oder Zigtausende eigene Source-Files geht ist das kein allzugrosses Ding.
MFC Dateien zu ändern ist auf jeden Fall ein Unding, und es würde auch erfordern dass du die MFC neu compilierst.
Dank für den Tipp, werde mir das Programm mal angucken.
EDIT:
SIEHE NÄCHSTER EINTRAG
-
Hier mal der Code von scsPoint.h:
#ifndef SCS_POINT_H #define SCS_POINT_H namespace ScsGeometry { class CPoint { protected: public: CPoint () {}; CPoint (const CPoint&) {}; virtual ~CPoint () {}; virtual void operator= (const CPoint&) = 0; virtual bool operator== (const CPoint&) const = 0; virtual bool tEqual (const CPoint&) const = 0; virtual bool operator!= (const CPoint& thatPoint) const ... }; } #endif // SCS_POINT_HOk, habe jetzt alles in einen Namespace gepackt. Soweit so gut, ich kriegen jetzt keinen CPoint Fehler mehr. Normalerweise kann man ja jetzt z.B. mit ScsGeometry::CPoint doch trotzdem auf die CPoint Datei im ScsGeometry zugreifen oder?
Also ich habe es probiert und bekomme immer:error C2653: 'ScsGeometry' : Keine Klasse oder NamespaceAllerdings beginnt die Autovervollständigung direkt nach den Doppelpunkten zu arbeiten und schlägt mir alles vor. Bin gerade verwirrt. Muss gestehen das ich noch nicht viel mit Namespaces gearbeitet habe.
Danke
Groove
-
GrooveXT schrieb:
_matze schrieb:
Ich würde mal sagen: Strg+Shift+H!
Die hätten ihre Klasse nicht CPoint nennen sollen.
War das jetzt nen ernst gemeinter Rat oder nen Joke den ich nicht ganz kapiere?
Ich habe meinem Chef auch schon gesagt, dass das einfach nen Unding ist...aber die haben da so einigen Mist verzapft. Ich wusste vorher gar nicht wie schlecht C++ Code aussehen kann.

Naja aber es gibt leider zuviele Verweiße auf die selbsterstellte CPoint Klasse, als das ich wirklich in betracht ziehen könnte sie umzubennen. Das wäre nen riesen Aufwand, an dem ich aber wohl nicht vorbei kommen werde, wenn ich nicht herausfinde wie man auf die afxwin direkt zugreift!Aber tortzdem schon mal danke für die Anteilnahme

Das war schon halbwegs ernst gemeint! Strg+Shift+H ist der Shortcut für "Ersetzen in Dateien"/"Replace in Files", also das was hustbaer vorgeschlagen hat.
Den Visual Assist X kann ich dir ebenfalls nu empfehlen. Gerade das Umbenennen ist damit ein Kinderspiel, da dann wirklich nach Referenzen gegangen wird und nicht nur eine simple Textsuche gemacht wird. So benennt man nicht versehentlich zu viel um. Kostet aber ca. 150$. Ich nutze den auch nur auf der Arbeit.
-
GrooveXT schrieb:
_matze schrieb:
Ich würde mal sagen: Strg+Shift+H!
Die hätten ihre Klasse nicht CPoint nennen sollen.
War das jetzt nen ernst gemeinter Rat oder nen Joke den ich nicht ganz kapiere?
Ich habe meinem Chef auch schon gesagt, dass das einfach nen Unding ist...aber die haben da so einigen Mist verzapft. Ich wusste vorher gar nicht wie schlecht C++ Code aussehen kann.

Naja aber es gibt leider zuviele Verweiße auf die selbsterstellte CPoint Klasse, als das ich wirklich in betracht ziehen könnte sie umzubennen. Das wäre nen riesen Aufwand, an dem ich aber wohl nicht vorbei kommen werde, wenn ich nicht herausfinde wie man auf die afxwin direkt zugreift!Aber tortzdem schon mal danke für die Anteilnahme

Schreibst Du den besseren Code? (Eine bestehende Klasse umzubenennen sind Grundlagen.)
VC++ 2008 erledigt dir das Umbenennen sogar automatisch.
Wenn Du aber nicht wirklich >1000 Ersetzungen hast dann dauert das vielleicht 1 Stunde es händisch durchzugehen.
-
Strg+Shift+F (Find in Files) kombiniert mit einem kleinen Makro kann auch noch ganz nützlich sein bei sowas.

-
Es sollte eigentlich reichen wenn du in jedes eigene Source-File (.cpp, NICHT .h*) nach den ganzen #include Zeilen und vor Beginn des "eigentliches Codes" ein
using namespace ScsGeometry;reinschreibst.
Ich hatte auch eher daran gedacht dass du den gesamten Source der Firma bzw. des Projektes in einen Namespace reinsteckst, aber wie du das aufteilst ist natürlich deine Sache.
Ansonsten, ja, du müsstest mit ScsGeometry::CPoint auf die Klasse zugreifen können.
"error C2653: 'ScsGeometry' : Keine Klasse oder Namespace" bedeutet dass er "ScsGeometry" nicht als Namespace oder Klasse kennt. Wenn "ScsGeometry" aber als Namespace in dem Header File "scsPoint.h" verwendet wird deutet das darauf hin dass dieses Header File an der Stelle des Fehlers noch nicht inkludiert wurde.