Willkommen im #Neuland
Login wie bei quake.ingame.de zuvor, die Passwörter aus der alten Datenbank wurden aber gelöscht - einmal hier neu anfordern.
Wer seine E-Mail-Adresse nicht mehr hat oder kennt, bitte eine Nachricht mit Infos schicken o. im Discord melden.

PQ Discord Server: #planetquake                                                                                                                                         Spenden? Hier entlang!

[C++]Linkerproblem: Header, Klassen

Forum für alles rund ums Coden und web.design - HTML, XHTML, XML, CSS, PHP, ASP, Zugriffsrechten, Mods uvm.
Antworten
Nomschta
Rampage
Rampage
Beiträge: 14303
Registriert: Jun 2001
Steam: TomHonks

[C++]Linkerproblem: Header, Klassen

Beitrag von Nomschta »

ich habe drei dateien:

Netclass.h: Funktionsprototypen (bzw. eigtl Methoden)
Netclass.cpp: Methoden
user.cpp: hier steht die main() die ausgeführt werden soll.

das problem ist: wenn ich den konstruktor direkt in die klasse packe, meckert der linker nicht. wenn ich nur den prototypen in der klasse angebe und den konstruktor in der datei Netclass.cpp realisiere, meint der linker, er kennt die funktion nicht.

hier der relevante code:

user.cpp

Code: Alles auswählen

[...]
#include "Netclass.h"
[...]
void user_main()
{
    class Net Testnet = Net("Testnet");
}
so funktioniert es:

netclass.h

Code: Alles auswählen

class Net
{
    [...]
    Net(string Name){this->Name = Name;}
    [...]
};
und so nicht:

netclass.h

Code: Alles auswählen

class Net
{
    [...]
    Net(string Name);
    [...]
};
netclass.cpp

Code: Alles auswählen

[...]
#include "Netclass.h"
[...]
Net::Net(string Name)
{
    this->Name = Name;
}
ausführliche fehlermeldung:

Warning 1 warning LNK4042: object specified more than once; extras ignored C:\HS\Sync\Semester VII\ADS\Projekt\Sync\Jones\Debug\Netclass.obj 1 1 ADS_NET

Error 2 error LNK2019: unresolved external symbol "public: __thiscall Node::Node(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (??0Node@@QAE@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) referenced in function "void __cdecl user_main(void)" (?user_main@@YAXXZ) C:\HS\Sync\Semester VII\ADS\Projekt\Sync\Jones\user.obj ADS_NET

Error 3 error LNK1120: 1 unresolved externals C:\HS\Sync\Semester VII\ADS\Projekt\Sync\Jones\Debug\ADS_NET.exe 1 1 ADS_NET

die zweite fehlermeldung bringt mir leider überhaupt nichts, da ich einfach nicht raffe wieso er die funktion nicht kennt, intellisense kennt sie jedenfalls :ugly:
muss ich irgendwo ein extern hinklatschen?
die erste verstehe ich auch nicht. ich hab doch nur den prototypen sowie die realisierung. wo soll da "more than once" sein?

das witzige ist auch, dass es bereits funktioniert hat und ich eigentlich an einer komplett anderen stelle gearbeitet habe als der fehler auftrat. einmal kam der fehler, ich hab "rebuild all" gemacht und der fehler war weg. alles sehr dubios. "clean" hat auch nichts gebracht. arbeite mit visual studio 2010.
BildBild Danke an Drasora für ihr Wichtelgeschenk!
MAR hat geschrieben:Führt der durch den Terrence-Hill? :ugly:
acid
Humilation
Humilation
Beiträge: 10614
Registriert: Aug 2001

Beitrag von acid »

Code: Alles auswählen

[...]
#include "Netclass.h"
[...]
void user_main()
{
    class Net Testnet = Net("Testnet");
}
Das class muss hier weg.
Bild
Nomschta
Rampage
Rampage
Beiträge: 14303
Registriert: Jun 2001
Steam: TomHonks

Beitrag von Nomschta »

hab ich bereits probiert, das ist es nicht
BildBild Danke an Drasora für ihr Wichtelgeschenk!
MAR hat geschrieben:Führt der durch den Terrence-Hill? :ugly:
acid
Humilation
Humilation
Beiträge: 10614
Registriert: Aug 2001

Beitrag von acid »

Es ist auf jeden Fall falsch :ugly:

Schreib mal Net Testnet = new Net("penis");
Bild
Nomschta
Rampage
Rampage
Beiträge: 14303
Registriert: Jun 2001
Steam: TomHonks

Beitrag von Nomschta »

ich hab dich schon verstanden ;) das ist es nicht! könnte dir das projekt mal per mail schicken

aber generell: wieso ist es falsch? wenn ich zB einen vector von der klasse "net" anlege, muss ich ja auch schreiben: vector<class Net>
BildBild Danke an Drasora für ihr Wichtelgeschenk!
MAR hat geschrieben:Führt der durch den Terrence-Hill? :ugly:
jiggly eL
Slash
Slash
Beiträge: 640
Registriert: Aug 2009

Beitrag von jiggly eL »

Lass das class trotzdem mal weg, ich hab ehrlich gesagt keine Ahnung, was das genau da soll/macht, aber es könnte so ne Art Vorwärtsdeklaration sein (?)

Hast du in der Header vor dem Konstruktor irgendwann "public:" stehen?

Und Variablen sollte man grundsätzlich klein schreiben (name und testNet), nur Klassennamen (nicht deren Instanzen) werden groß geschrieben, und manchmal schreibt man auch statische Funktionen und Variablen groß. Liest sich einfach besser.
Roughael
Stripe
Stripe
Beiträge: 2498
Registriert: Mär 2002

Beitrag von Roughael »

class gibt man immer nur dann mit an wenn die klasse nicht bekannt ist.
also z.b. in einem funktionsprototyp, wo die klasse nicht bekannt ist.
sobald du das objekt des klassentyps nutzen willst muss die klasse dann allerdings vorhanden sein.
also vector<class bla> ist unnötig wenn bla schon definiert ist.

generell sollte man das class nie so angeben, sondern eher in der datei oder einem header die klasse einmal bekannt machen:
class bla;
void blubber(bla *brrr);

was dein eigentliches problem angeht:
was zum henker ist Node ?
Ich mein das ist nicht die klasse die du hier aufführst, es scheint aber die problemklasse zu sein.
<-- Ehemaliger TTK-Bandit, bis inquake rumzickte -->

Dict.cc Firefox Addon | Q3Devel | Code3Arena(De) | GameType Revolution | Open Game Libraries
Antworten