Klassenprobleme



  • Hi!

    Wir gehen stoffmäßig nun gut zur Sache und irgendwas fehlt mir im Bereich Klassen.
    Ich frage mich wo hier der Fehler liegt - es muss irgendwas mit Parameterübergabe/Variablenverwendung odr so zu tun haben. Ich nehme an besonders im VOID SETUP könnte sich was eingeschlichen haben!

    Hier die Kompilierfehler:

    error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""private: int __thiscall karte::Random(int)" (?Random@karte@@AAEHH@Z)" in Funktion ""public: void __thiscall karte::setup(void)" (?setup@karte@@QAEXXZ)".	karte.obj	
    
    fatal error LNK1120: 1 nicht aufgelöste externe Verweise.	C:\Dokumente und Einstellungen\Administrator\Eigene Dateien\Visual Studio 2005\Projects\Wumpus\Debug\Wumpus.exe	1
    

    Ja und hier die zusammenhängenden Files, die ihr braucht um es zu verstehen:

    karte.h

    #ifndef KARTE
    #define KARTE
    
    #define LEER	0
    #define WUMPUS	1
    #define GOLD	2
    #define BAT		4
    #define HOLE	8
    #define W_N		16
    #define W_S		32
    #define W_E		64
    #define W_W		128
    #define SMELL	256
    #define WIND	512
    
    // Max Values
    #define MAXX 100
    #define MAXY 100
    
    class karte
    {
    	public:
    	karte();
    	karte(int coordx, int coordy);
    	void print();
    	void setup();
    	int mapsize(int c);
    
    	private:
    	int c;
    	int x,y;
    	int cx,cy;
    	int map[MAXX][MAXY];
    	int Random(int var);
    
    };
    
    #endif
    

    karte.cc

    #include <iostream>
    #include "karte.h"
    #include "time.h"
    
    using namespace std;
    
    karte::karte()
    {
    	x=5;
    	y=5;
    	cx=5;
    	cy=5;
    	//map = {0}
    }
    
    karte::karte(int coordx, int coordy)
    {
    	cx=coordx;
    	cy=coordy;
    	//map = {0};
    }
    
    void karte::setup()
    {
    	x=Random(cx);
    	y=Random(cy);
    	map[x][y]=WUMPUS;
    	map[x+1][y]=SMELL;
    	map[x-1][y]=SMELL;
    	map[x][y+1]=SMELL;
    	map[x][y-1]=SMELL;
    }
    
    int Random(int var)
    {
    	srand(time(NULL));
    	int i=rand()%var;
    	return i;
    }
    
    int karte::mapsize(int c)
    {
    	switch(c)
    	{
    		case 0: return cx;
    		case 1: return cy;
    		default: return 0;
    	}
    }
    void karte::print()
    {
    	for(int i=0; i<cx; i++)
    	{
    		for(int j=0; i<cy; i++)
    		{
    			cout << map[i][j] << "\t";
    		}
    	cout << endl;
    	}
    }
    

    wumpus.cc

    #include <iostream>
    //#include "agent.h"
    #include "karte.h"
    
    using namespace std;
    
    int main()
    {
    	karte k;
    	k.setup();
    	k.print();
    	return 0;
    }
    

    Wäre so super, wenn sich jemand die Zeit nehmen würde mir das zu erklären. Wirklich!



  • Ein Fehler, dem jeden schon mal passiert ist...

    Du solltest die Datei karte.cc noch einmal in Ruhe durchgehen. Das sollte dir eigentlich ins Auge springen 😉

    Grüße... Heiko



  • Hi,
    es handelt sich nicht um einen Kompilier- als viel mehr um einen Linkerfehler. Der Grund ist einfach: du hast vergessen die Random Funktion aus der Klasse Karte zu definieren.

    karte.cc

    int karte::Random(int) 
    { 
        // tu was
    }
    

    Gruss,
    DeSoVoDaMu

    Edit: ich sehe gerade...du hast eine Random funktion, diese ist aber nicht als Methode der Klasse definiert.
    ➡

    int karte::Random(int var) 
    { 
        srand(time(NULL)); 
        int i=rand()%var; 
        return i; 
    }
    

    Also bei der vorhandenen karte:: ergaenzen



  • Hi! Danke für die schnelle Antwort - nein! ich bin das schon mehrere Male durchgegangen -> mir fehlt echt irgend ein Verständnispunkt: Ich kann x, y, cx und cy doch im setup verwenden oder? die sind doch public!?

    Ich hab da schon so herumprobiert, aber ich komm irgendwie nicht klar - gib mir bitte noch einen genaueren Anhaltspunkt!

    Danke!

    edit:

    Aha! Ich habe jetzt die "int var" noch eingefügt unten bei private bei der karte.h und beim konstruktor var dann einen wert gesetzt, aber es bringt nichts. Und übrigends: Random ist unter private doch schon drinnen.

    Bitte: was mache ich falsch?



  • Ich verstehe es absolut nicht: Ich habe Random, die als Übergabeparameter var hat. Nun habe ich das aber so in der Klasse deklariert und selbst im Konstruktor int var einen Wert zugewiesen. Das muss doch gehen. Liegt es vllt. doch noch an was anderem?

    mfg XaT



  • Hast du denn den bisherigen Vorschlag umgesetzt und statt "int Random(int var)" in karte.cc "int karte::Random(int var)" geschrieben?



  • ach ne! jetzt weiß ich erst was gemeint war! Danke vielmals. Okay jetzt kommen nur noch die Standardsyntaxfehler, die ich sicher raus bekommen werde! Danke viel viel mals!



  • okay gut es funktioniert nun - jetzt allerdings ein praxisbezogenes Problem damit (oben steht ja noch der Quellcode):

    Ich setze ja in der Setup auf einer Zufallsposition den Wumpus, und rundherum setze ich ja den Smell.

    Ich gebe das Array (das Spielfeld) ja mit der For-Schleife aus (print), und anstatt hier die DEFINE Zahlen (binär!) aufgelistet zu sehen sehe ich auf JEDEM einzelnen feld, selbst auf dem, wo der wumpus stehen sollte, die Zahl -858993460!

    wird irgendwas mit einer Speicheradresse oder so zu tun haben.

    Was mach ich hier wieder falsch?

    EDIT:

    OK OK ich bin im Wahn!!!! Ich hab's gelöst, zu dumm: muss natürlich zuerst alle Felder mit LEER initialisieren...der Wumpus existiert NOCH nicht, kA warum, kommt aber noch!



  • Hi,

    nur noch als Randnotiz zum Lernen:

    XaTrIxX schrieb:

    ...

    #define LEER	0
    #define WUMPUS	1
    #define GOLD	2
    #define BAT		4
    #define HOLE	8
    #define W_N		16
    #define W_S		32
    #define W_E		64
    #define W_W		128
    #define SMELL	256
    #define WIND	512
    
    // Max Values
    #define MAXX 100
    #define MAXY 100
    

    ...

    Lass das besser sein. Macht nur Ärger und hat keinen Vorteil gegenüber der Definition von Konstanten (und nein: Obwohl ich "Definition" gesagt habe, meinte ich NICHT "#define" 😉 ).

    size_t const LEER = 0;
    size_t const WUMPUS = 1;
    size_t const GOLD = 2;
    size_t const BAT = 4;
    size_t const HOLE = 8;
    size_t const W_N = 16;
    size_t const W_S = 32;
    size_t const W_E = 64
    size_t const W_W = 128;
    size_t const SMELL = 256;
    size_t const WIND = 512;
    
    // Max Values
    size_t const MAXX = 100;
    size_t const MAXY = 100;
    

    Oder meinetwegen mit enums, wenn Du sie nie adressieren musst.

    Gruß,

    Simon2.


Anmelden zum Antworten