Forum: PC-Programmierung [C++]Linkerproblem: Header, Klassen


von Frank M. (aktenasche)


Lesenswert?

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
1
[...]
2
#include "Netclass.h"
3
[...]
4
void user_main()
5
{
6
    class Net Testnet = Net("Testnet");
7
}
so funktioniert es:

netclass.h
1
class Net
2
{
3
    [...]
4
    Net(string Name){this->Name = Name;}
5
    [...]
6
};
und so nicht:

netclass.h
1
class Net
2
{
3
    [...]
4
    Net(string Name);
5
    [...]
6
};
netclass.cpp
1
[...]
2
#include "Netclass.h"
3
[...]
4
Net::Net(string Name)
5
{
6
    this->Name = Name;
7
}
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@@s 
td@@@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
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.

von Klaus W. (mfgkw)


Lesenswert?

Hast du die netclass.cpp auch zum Projekt hinzugefügt?

von Frank M. (aktenasche)


Lesenswert?

ich hab sie im visual studio erstellt, also denke ich mal ja

von Rolf M. (rmagnus)


Lesenswert?

Denken ist Glückssache. Also besser prüfen, ob's auch wirklich so ist.

von Frank M. (aktenasche)


Lesenswert?

denken ist logik und nicht glückssache. wieso sollte die datei nicht dem 
projekt hinzugefügt werden wenn man sie innerhalb des projektes mit den 
funktionen der IDE erstellt?

ein rechtsklick liefert "exclude from project".

von C++, NOT Java (Gast)


Lesenswert?

Nimm mal das "class" in user_main() weg!

von Frank M. (aktenasche)


Lesenswert?

wurde mir schon von anderer seite vorgeschlagen, macht leider keinen 
unterschied...

von C++, NOT Java (Gast)


Lesenswert?

Der Fehler 2 bezieht sich auf eine Klasse "Node"!

Da Du uns ja nicht alles zeigen willst, hier mal eine weitere 
Spekulation:

Deklariere mal den Kontruktor von Node "explicit"...

von Rolf M. (rmagnus)


Lesenswert?

Frank Meier schrieb:
> denken ist logik und nicht glückssache.

Dann betrachten wir es eben logisch: Da du ja denkst, daß alles korrekt 
ist, funktioniert alles, und du hast gar kein Problem ... denke ich.

> wieso sollte die datei nicht dem projekt hinzugefügt werden wenn man sie
> innerhalb des projektes mit den funktionen der IDE erstellt?

Was weiß denn ich? Fehler passieren. Das hier:

Frank Meier schrieb:
> 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

zeigt ja schon, das da was nicht stimmt. Da ist das File sogar doppelt 
drin.

von Frank M. (aktenasche)


Lesenswert?

die info dass irgendwo irgendwas doppelt ist hatte ich auch schon.

habe die betreffenden dateien gelöscht und neu hinzugefügt, jetzt 
funktioniert es wieder.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.
Lade...