2016-06-25 7 views
0

Ich weiß, was dieser Fehler ist, und was es bedeutet, aber für das Leben von mir kann ich das Problem nicht finden. (. Ich bin an einem Spiel arbeiten, die für das Kreieren von modularen Geräten ermöglicht, und das ist, wo der Zusammenbruch geschieht)C++ LNK2019 Fehler, ungelöste externe Zeichen

zum besten meines Wissens habe ich:

-Ich alles inklusive der # beinhaltet, dass ich brauche.

-Ich meine Funktionen überprüft, um sicherzustellen, sie haben Definitionen

-Ich sicher, dass alles gemacht wird quadriert weg mit, wie die Klassen kommunizieren

hier ist ein Teil des Codes (ich habe 21 Item-Typen jetzt, also werde ich nur ein paar Stücke verwenden):

// Dies ist nur ein Teil dieser Funktion, aber es ist nur das gleiche Ding den ganzen Weg hinunter. Hier scheint der Zusammenbruch zu geschehen.

void Inventory::chooseItem(int tag) 
{ 
switch (tag) 
{ 

    //armor 

case '1': 
    addArmorBack(makeNewArmor1(holder.back())); 
    break; 

case '2': 
    addArmorBreastplate(makeNewArmor2(holder.back())); 
    break; 

case '3': 
    addArmorStraps(makeNewArmor3(holder.back())); 
    break; 

// Die relevanten Daten Halter im privaten Bereich des .h:

vector<ItemPart> holder; 
ArmorBack makeNewArmor1(ItemPart held); 
ArmorBreastplate makeNewArmor2(ItemPart held); 
ArmorStraps makeNewArmor3(ItemPart held); 

// Artikel Teillisten

vector<ArmorBack> armorBackList; 
vector<ArmorBreastplate> armorBreastplateList; 
vector<ArmorStraps> armorStrapsList; 

// Dies ist ein Beispiel der Funktionen Ich verwende, um Dinge zu meiner Liste hinzuzufügen. Es ist die gleiche Funktion für jeden Gegenstand.

void Inventory::addArmorBack(ArmorBack makeNew) 
{ 
    string name; 
    armorBackList.push_back(makeNew); 
    name = makeNew.getName(); 
    addItem(name); 
} 

// die ItemPart Klasse BEKOMMT Daten, dann andere Funktionen leiten die Daten an den richtigen Artikel Teil des Tag-int mit:

class ItemPart 
{ 
public: 
ItemPart(int attack, int defense, int health, int experienceMult,  int tag, string name); 

//setters 
void setName(); 
//getters 
int getDefense(); 
int getAttack(); 
int getHealth(); 
int getExperienceMult(); 
int getTag(); 
string getName(); 

private: 
string _name; 

int _defense; 
int _attack; 
int _health; 
int _experienceMult; 
int _tag; 
}; 

// schließlich die relevanten Artikel Klasse recieves die Daten:

ArmorBack::ArmorBack(ItemPart crafted) 
{ 

_attack = crafted.getAttack(); 
_defense = crafted.getDefense(); 
_health = crafted.getHealth(); 
_experienceMult = crafted.getExperienceMult(); 
_tag = crafted.getTag(); 
_name = crafted.getName(); 
} 

edit: hier ist der Fehlertext. Ich habe eine davon für jeden Elementtyp, den ich implementiert habe:

Fehler 37 Fehler LNK2019: ungelöst externes Symbol "private: Klasse ArmorBack __thiscall Inventar :: makeNewArmor1 (Klasse ItemPart)" (? MakeNewArmor1 @ Inventory @ AAE? AVArmorBack @@ VItemPart @@@ Z) referenziert in der Funktion "public: void __thiscall Inventar :: choiceItem (int)" (? WähleItem @ Inventar @@ QAEXH @ Z) C: \ Benutzer \ Forresto \ Dokumente \ Visual Studio 2012 \ Projekte \ Spiel Herausforderung ascii \ Spiel Herausforderung ascii \ Inventory.obj Spiel Herausforderung ascii

+0

Obwohl dies mit einem Linker Fehler nichts zu tun hat: 'case '1':' Hast du wirklich '1' gemeint und nicht nur 1 – drescherjm

+1

Kannst du den vollständigen Text der Fehlermeldung? Kopieren Sie es aus dem Ausgabefenster (Alt-2). – drescherjm

+0

Ja, jeder Teil hat ein nummeriertes Tag, mit dem ich definiere, welchen Teil die jeweilige ItemPart-Verwendung darstellen soll – forresto

Antwort

1

Nur weil Sie die Member-Funktion

ArmorBack makeNewArmor1(ItemPart held); 

Klasse definiert, i In der Kopfzeile bedeutet dies nicht, dass diese Elementfunktion aus der Luft gegriffen wird. Es ist nur deklariert und muss in einer Übersetzungseinheit (.cpp Datei) definiert werden. makeNewArmor1() wird von chooseItem() aufgerufen, so dass Sie diese Elementfunktion irgendwo definieren müssen.

Nichts, was Sie gepostet haben, zeigt an, dass diese Elementfunktion überall definiert ist. Wenn es in einer Übersetzungseinheit definiert ist, wird es nicht richtig verknüpft.Der Link Fehler Sie zeigte:

Error 37 error LNK2019: unresolved external symbol "private: class 
ArmorBack __thiscall Inventory::makeNewArmor1(class ItemPart)" 
([email protected]@@[email protected]@[email protected]@@Z) referenced 
in function "public: void __thiscall Inventory::chooseItem(int)" 

ziemlich selbsterklärend ist. Es ist wahr, dass C++ berüchtigt für verwirrende, unverständliche Kompilierungsfehler ist. Aber das ist keiner von ihnen. Es sagt ziemlich viel, was das Rindfleisch ist: undefiniertes Symbol. Außerdem erfahren Sie, welches Symbol nicht definiert ist und von wo es referenziert wird. Das wars so ziemlich. Nicht viel mehr, was hier bekannt sein muss.

Entfernen Sie entweder den Aufruf an makeNewArmor1(), oder definieren Sie diese Methode in einer Ihrer Übersetzungseinheiten, oder ermitteln Sie, ob die Übersetzungseinheit, die diese Elementfunktion definiert, nicht korrekt kompiliert und/oder verknüpft wird.

Dito für die anderen Linkfehler, die Sie zeigten.

Verwandte Themen