AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Classen in C++

Ein Thema von EWeiss · begonnen am 4. Mär 2014 · letzter Beitrag vom 4. Mär 2014
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

AW: Classen in C++

  Alt 4. Mär 2014, 16:22
Habe es nochmal versucht
Language.cpp
Code:
#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];
}
Language.h
Code:
#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);

};
Wenn ich jetzt die Language.h zu meiner EditChannelAssignment.cpp addiere bekomme ich beim kompilieren
Jede menge unresolved external und andere diverse Fehler.
Mir fällt nicht ein was da falsch sein sollte.

Code:
sprintf(szFileINI, "%s\\Language.ini\0", CLanguage::GetCurrentDir());
Dieser Aufruf sollte mir dann eigentlich die Directory zurückgeben
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

Geändert von EWeiss ( 4. Mär 2014 um 16:24 Uhr)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Classen in C++

  Alt 4. Mär 2014, 16:28
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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Classen in C++

  Alt 4. Mär 2014, 16:35
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.
Die frage wäre dann ist das nun C oder C++.
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
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Classen in C++

  Alt 4. Mär 2014, 16:38
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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Classen in C++

  Alt 4. Mär 2014, 16:48
Das sind die Fehler

Zitat:
Error 9 error LNK2005: "char * * sTextChannelAssignment" (?sTextChannelAssignment@@3PAPADA) already defined in Language.obj C:\Program Files (x86)\Microsoft Visual Studio\VB98\Sourcemein\AtmoLight Projekt\AtmoWin\AtmoEditChannelAssignment.obj AtmoWinA
Error 12 error LNK2001: unresolved external symbol "public: static class ATL::CStringT<char,class ATL::StrTraitATL<char,class ATL::ChTraitsCRT<char> > > * CLanguage::sText" (?sText@CLanguage@@2PAV?$CStringT@DV?$StrTraitATL@ DV?$ChTraitsCRT@D@ATL@@@ATL@@@ATL@@A) C:\Program Files (x86)\Microsoft Visual Studio\VB98\Sourcemein\AtmoLight Projekt\AtmoWin\AtmoEditChannelAssignment.obj AtmoWinA
Error 15 error LNK2001: unresolved external symbol "public: static char * CLanguage::szTemp" (?szTemp@CLanguage@@2PADA) C:\Program Files (x86)\Microsoft Visual Studio\VB98\Sourcemein\AtmoLight Projekt\AtmoWin\AtmoEditChannelAssignment.obj AtmoWinA
Error 17 error LNK2001: unresolved external symbol "public: static char * CLanguage::szParam" (?szParam@CLanguage@@2PADA) C:\Program Files (x86)\Microsoft Visual Studio\VB98\Sourcemein\AtmoLight Projekt\AtmoWin\AtmoEditChannelAssignment.obj AtmoWinA
Error 14 error LNK2001: unresolved external symbol "public: static char * CLanguage::szLang" (?szLang@CLanguage@@2PADA) C:\Program Files (x86)\Microsoft Visual Studio\VB98\Sourcemein\AtmoLight Projekt\AtmoWin\AtmoEditChannelAssignment.obj AtmoWinA
Error 13 error LNK2001: unresolved external symbol "public: static char * CLanguage::szFileINI" (?szFileINI@CLanguage@@2PADA) C:\Program Files (x86)\Microsoft Visual Studio\VB98\Sourcemein\AtmoLight Projekt\AtmoWin\AtmoEditChannelAssignment.obj AtmoWinA
Error 10 error LNK2001: unresolved external symbol "public: static char * CLanguage::szCurrentDir" (?szCurrentDir@CLanguage@@2PADA) C:\Program Files (x86)\Microsoft Visual Studio\VB98\Sourcemein\AtmoLight Projekt\AtmoWin\Language.obj AtmoWinA
Error 11 error LNK2001: unresolved external symbol "public: static char * CLanguage::szCurrentDir" (?szCurrentDir@CLanguage@@2PADA) C:\Program Files (x86)\Microsoft Visual Studio\VB98\Sourcemein\AtmoLight Projekt\AtmoWin\AtmoEditChannelAssignment.obj AtmoWinA
Error 16 error LNK2001: unresolved external symbol "public: static char * CLanguage::Buffer" (?Buffer@CLanguage@@2PADA) C:\Program Files (x86)\Microsoft Visual Studio\VB98\Sourcemein\AtmoLight Projekt\AtmoWin\AtmoEditChannelAssignment.obj AtmoWinA
Error 18 error LNK1120: 7 unresolved externals C:\Program Files (x86)\Microsoft Visual Studio\VB98\Sourcemein\AtmoLight Projekt\AtmoWin\Release\AtmoWinA.exe 1 1 AtmoWinA
Der Witz dabei sTextChannelAssignment already defined in Language.obj
Wurde nirgends anders definiert

gruss

Geändert von EWeiss ( 4. Mär 2014 um 16:58 Uhr)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Classen in C++

  Alt 4. Mär 2014, 17:05
Das sind die Fehler

Zitat:
Error 9 error LNK2005: "char * * sTextChannelAssignment" (?sTextChannelAssignment@@3PAPADA) already defined in Language.obj C:\Program Files (x86)\Microsoft Visual Studio\VB98\Sourcemein\AtmoLight Projekt\AtmoWin\AtmoEditChannelAssignment.obj AtmoWinA
Also ich würde mich zunächst mal um den ersten Fehler kümmern:

Offensichtlich ist die Variable sTextChannelAssignment 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.).

Die anderen Fehler sind möglicherweise Folgefehler, die daraus resultieren, dass wegen diesem Konflikt die .obj-Datei nicht gelinkt werden kann.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: Classen in C++

  Alt 4. Mär 2014, 17:41
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:
char *sTextChannelAssignment[MAX_CHANNELASSIGNMENT_STRINGS] =
{"Off",                   //0
"Top",                    //1
"Right",                  //2
"Bottom",                 //3
"Left",                   //4
"Combined",               //5
};
Die ist garantiert nicht doppelt definiert.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#8

AW: Classen in C++

  Alt 4. Mär 2014, 17:57
Ich denke, ich habe das Problem gefunden:

Deine Klassenvariablen hast du nur deklariert, aber nicht definiert. Siehe z.B. diesen Blog-Eintrag.
Andererseits definierst du dir in jeder Datei, die "Language.h" einbindet, die Variable sTextChannelAssignment neu.

Lösung:

Language.cpp
Code:
#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];
}
Language.h
Code:
#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);

};
Ich konnte es leider nicht ausprobieren, da ich unter Windows keinen C++-Compiler installiert habe
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#9

AW: Classen in C++

  Alt 4. Mär 2014, 18:12
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.

Geändert von Namenloser ( 4. Mär 2014 um 18:20 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:40 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