![]() |
Classen in C++
Sorry ja!
Ich weis das ist ein Delphi Forum aber vielleicht kann mir trotzdem jemand helfen. Ich arbeite an einer C++ Anwendung und verstehe die Erstellung der Klassen anscheinend nicht so richtig. Ich verwende immer wieder gleich auftretende Funktionen die ich gerne in eine Klasse einsetzen würde mein Problem ist aber das ich dann Probleme mit dem Linker und dem Zugriff auf dieser Klasse habe.
Code:
char *sTextMenu[MAX_MENU_STRINGS] =
{"Setting", //0 "Language", //1 "Mode", //2 "no effect", //3 "life", //4 "static color", //5 "color changer", //6 "color changer LR", //7 "channel assignment", //8 "Info", //9 "Exit", //10 }; CString sMenuText[MAX_MENU_STRINGS]; char szFileINI[MAX_PATH]; char szCurrentDir[MAX_PATH];
Code:
// Find available Language Files
void *hSearch; WIN32_FIND_DATA wfd; char szFile[MAX_PATH]; hSearch = FindFirstFile("*.lng", &wfd); GetPrivateProfileString("Common", "Language", "English", szLang, 256, szFileINI); nCurrentLanguage = MENUID_FIRST_LANGUAGE; AppendMenu(m_hLanguageSubMenu, MF_STRING, MENUID_FIRST_LANGUAGE, "&English"); nLanguages = 1; if (hSearch != INVALID_HANDLE_VALUE) { do { strcpy(szFile, wfd.cFileName); szFile[strlen(szFile) - 4] = 0; if (!strcmp(szFile, "English")) continue; if (!strcmp(szFile, szLang)) nCurrentLanguage = MENUID_FIRST_LANGUAGE + nLanguages; AppendMenu(m_hLanguageSubMenu, MF_STRING, MENUID_FIRST_LANGUAGE + nLanguages, szFile); nLanguages++; } while (FindNextFile(hSearch, &wfd)); } FindClose(hSearch);
Code:
Wie kann ich jetzt das alles in eine Klasse unterbringen?
// Read Buffer from IniFile
sprintf(szTemp, "%s\\%s.lng\0", szCurrentDir, szLang); for (i = 0; i < MAX_MENU_STRINGS; i++) { sprintf(szParam, "%d\0", i); GetPrivateProfileString("Menu", szParam, sTextMenu[i], Buffer, 512, szTemp); sMenuText[i] = Buffer; sMenuText[i].Replace("\\t", "\t"); sMenuText[i].Replace("\\n", "\n"); } Und von allen anderen drauf zugreifen ohne besagte Linker error. Gruss |
AW: Classen in C++
Wie sieht deine Klasse aus und was genau sagt der Linker?
|
AW: Classen in C++
Zitat:
Code:
Language.cpp
#pragma once
class Language { public: Language(void); virtual ~Language(void); };
Code:
Ich habe noch keine bzw. mich aber vorher schon dran versucht.
#include "stdafx.h"
#include "Language.h" #include "atlstr.h" Language::Language(void) { } Language::~Language(void) { } Der Linker meldet dann das die Deklaration unter Verwendung wären. Normaler weise sollte es doch möglich sein eine Language.h zu erstellen auf der ich dann aus allen Dialogen zugreifen kann, der Übersetzung wegen halt. Da kommen aber extrem viele Linker Fehler Meldungen. EDIT: Hab mal eine Default Klasse addiert. gruss |
AW: Classen in C++
Habe es nochmal versucht
Language.cpp
Code:
Language.h
#include "stdafx.h"
#include "Language.h" CLanguage::CLanguage(void) { } CLanguage::~CLanguage(void) { } char CLanguage::GetCurrentDir() { int i = GetCurrentDirectory(255, (char*)szCurrentDir); if (szCurrentDir[i - 1] == '\\') szCurrentDir[i - 1] = 0; return szCurrentDir[i]; }
Code:
Wenn ich jetzt die Language.h zu meiner EditChannelAssignment.cpp addiere bekomme ich beim kompilieren
#pragma once
#include "atlstr.h" #define MAX_CHANNELASSIGNMENT_STRINGS 6 char *sTextChannelAssignment[MAX_CHANNELASSIGNMENT_STRINGS] = {"Off", //0 "Top", //1 "Right", //2 "Bottom", //3 "Left", //4 "Combined", //5 }; class CLanguage { private: public: static CString sText[MAX_CHANNELASSIGNMENT_STRINGS]; static char szCurrentDir[MAX_PATH]; static char szFileINI[MAX_PATH]; static char szLang[MAX_PATH], szTemp[512], Buffer[1024], szParam[32]; static char GetCurrentDir(); CLanguage(void); virtual ~CLanguage(void); }; Jede menge unresolved external und andere diverse Fehler. Mir fällt nicht ein was da falsch sein sollte.
Code:
Dieser Aufruf sollte mir dann eigentlich die Directory zurückgeben
sprintf(szFileINI, "%s\\Language.ini\0", CLanguage::GetCurrentDir());
Aber wie wenn sich der Quelltext nicht mal compilieren lässt. Fehlt mir noch irgendein include? Ohne die beiden Dateien funktioniert alles es muss also mit dem einbinden dieser zu tun haben. PS: Warum die Variablen jetzt alle static sein müssen obwohl puplic deklariert versteh ich jetzt auch nicht. gruss |
AW: Classen in C++
Wie kompilierst du?
Ich hatte auch mal so ein Problem und es lag einfach daran, dass die .cpp-Datei niemals kompiliert wurde. Die .h-Dateien werden ja immer automatisch kompiliert, weil sie ja inkludiert werden, aber der Compiler erkennt nicht automatisch, dass die .cpp-Datei dazugehört. Deshalb muss die extra im Makefile angegeben werden. Vielleicht fehlt sie dort. |
AW: Classen in C++
Zitat:
Ich verwende Visual Studio 2012 wüsste jetzt nicht ob ich da jetzt ein MakeFile anlegen muss, glaube aber nicht. IN VS ist sie im Projekt eingebunden müsste also erkannt werden. Werde nochmal einen versuch machen und dann alle Fehler posten. gruss |
AW: Classen in C++
Es macht eigentlich keinen Unterschied, ob C oder C++, das Kompilieren läuft bei beiden nach dem gleichen Prinzip ab. Wenn du eine IDE verwendest, dann legt die wahrscheinlich das Makefile automatisch für dich an.
|
AW: Classen in C++
Das sind die Fehler
Zitat:
Wurde nirgends anders definiert gruss |
AW: Classen in C++
Zitat:
Offensichtlich ist die Variable
Delphi-Quellcode:
schon woanders definiert. Du musst bei C++ (und C) beachten, dass die Dateien dort keine "Units" sind wie bei Delphi. Das heißt, es kann immer nur genau eine globale Variable mit einem bestimmten Namen im ganzen Programm (nicht bloß pro Datei) geben (das gleiche gilt für Konstanten, Klassennamen, Funktionsnamen etc.).
sTextChannelAssignment
Die anderen Fehler sind möglicherweise Folgefehler, die daraus resultieren, dass wegen diesem Konflikt die .obj-Datei nicht gelinkt werden kann. |
AW: Classen in C++
sTextChannelAssignment ist garantiert nicht doppelt deklariert.
Wenn ich auf sTextChannelAssignment gehe und mir die Definition davon aufzeigen lasse geht er direkt in die Language.h auf
Code:
Die ist garantiert nicht doppelt definiert.
char *sTextChannelAssignment[MAX_CHANNELASSIGNMENT_STRINGS] =
{"Off", //0 "Top", //1 "Right", //2 "Bottom", //3 "Left", //4 "Combined", //5 }; gruss |
AW: Classen in C++
Ich denke, ich habe das Problem gefunden:
Deine Klassenvariablen hast du nur deklariert, aber nicht definiert. Siehe z.B. diesen ![]() Andererseits definierst du dir in jeder Datei, die "Language.h" einbindet, die Variable sTextChannelAssignment neu. Lösung: Language.cpp
Code:
Language.h
#include "stdafx.h"
#include "Language.h" char *sTextChannelAssignment[MAX_CHANNELASSIGNMENT_STRINGS] = {"Off", //0 "Top", //1 "Right", //2 "Bottom", //3 "Left", //4 "Combined", //5 }; CString CLanguage::sText[MAX_CHANNELASSIGNMENT_STRINGS]; char CLanguage::szCurrentDir[MAX_PATH]; char CLanguage::szFileINI[MAX_PATH]; char CLanguage::szLang[MAX_PATH]; char CLanguage::szTemp[512]; char CLanguage::Buffer[1024]; char CLanguage::szParam[32]; CLanguage::CLanguage(void) { } CLanguage::~CLanguage(void) { } char CLanguage::GetCurrentDir() { int i = GetCurrentDirectory(255, (char*)szCurrentDir); if (szCurrentDir[i - 1] == '\\') szCurrentDir[i - 1] = 0; return szCurrentDir[i]; }
Code:
Ich konnte es leider nicht ausprobieren, da ich unter Windows keinen C++-Compiler installiert habe :mrgreen:
#pragma once
#include "atlstr.h" #define MAX_CHANNELASSIGNMENT_STRINGS 6 extern char *sTextChannelAssignment[MAX_CHANNELASSIGNMENT_STRINGS]; class CLanguage { private: public: static CString sText[MAX_CHANNELASSIGNMENT_STRINGS]; static char szCurrentDir[MAX_PATH]; static char szFileINI[MAX_PATH]; static char szLang[MAX_PATH], szTemp[512], Buffer[1024], szParam[32]; static char GetCurrentDir(); CLanguage(void); virtual ~CLanguage(void); }; |
AW: Classen in C++
Interessant. Ich hatte unter C++ selber bisher nur mit statischen Methoden zu tun, aber nicht mit statischen Variablen. Wieder was gelernt...
Es sind immer solche Momente – wenn es plötzlich ungewohnt Low-Level wird – in denen man C++ anmerkt, dass es eigentlich doch nur ein Aufsatz für C ist. |
AW: Classen in C++
@BUG @Namenloser
Danke euch;) Jo ist einiges anders als in Delphi :) gruss |
AW: Classen in C++
Wäre klasse wenn ich das teil noch in eine function bekomme
Hab ich es einmal verstanden sollte das kein Problem mehr sein ;)
Code:
Sollte ein Array der Language Files zurück gegeben werden.
// Find available Language Files
void *hSearch; WIN32_FIND_DATA wfd; char szFile[MAX_PATH]; hSearch = FindFirstFile("*.lng", &wfd); GetPrivateProfileString("Common", "Language", "English", szLang, 256, szFileINI); nCurrentLanguage = MENUID_FIRST_LANGUAGE; AppendMenu(m_hLanguageSubMenu, MF_STRING, MENUID_FIRST_LANGUAGE, "&English"); nLanguages = 1; if (hSearch != INVALID_HANDLE_VALUE) { do { strcpy(szFile, wfd.cFileName); szFile[strlen(szFile) - 4] = 0; if (!strcmp(szFile, "English")) continue; if (!strcmp(szFile, szLang)) nCurrentLanguage = MENUID_FIRST_LANGUAGE + nLanguages; AppendMenu(m_hLanguageSubMenu, MF_STRING, MENUID_FIRST_LANGUAGE + nLanguages, szFile); nLanguages++; } while (FindNextFile(hSearch, &wfd)); } FindClose(hSearch); Funktioniert ist aber zur zeit nicht als function ausgelegt. Sollte Teil der language.h sein gruss |
AW: Classen in C++
Zitat:
Ich könnte mir vorstellen, das szLang die Klassenvariable von CLanguage ist. Aber wo kommt m_hLanguageSubMenu her? Das gleiche gilt für nLanguages und nCurrentLanguage. Zitat:
BTW: Wenn du weiter mit C++ arbeiten willst, solltest du dir die Standard-Library angucken. Nahe an den Betriebssystemfunktionen mögen Character-Buffer noch sinnvoll sein, ansonsten ist die Klasse std::string um Welten angenehmer. Auch die Container-Klassen sind ziemlich nützlich. |
AW: Classen in C++
Zitat:
Denke muss die abfrage dann wohl in der aktuellen Funktion belassen. Ist aber nicht weiter tragisch da ich diese nur einmal aufrufe um im Ordner die Sprachdateien zu finden. Man will es immer besonders gut machen und schlechten code will ich nicht gerade abliefern ;) Danke für die zusätzlichen Infos werden bestimmt mal nützlich sein. Ach so.. Danke nochmal im nachhinein für mein Geburtstags Geschenk! :) Die Classe läuft jetzt so wie sie soll. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz