Fehler: unresolved external symbol "private: static int Spiel::Breite"



  • Ich wollte Minesweeper in C++ nachprogrammieren.
    Am Anfang soll man Hoehe und Breite des Spielfeldes angeben, es soll getestet werden, ob die Zahl zwischen der minimalen und maximalen Hoehe, bzw Breite ist, wenn nicht, soll es diese Zahl noch einmal abfragen. Dazu habe ich eine Klasse "Spiel" gemacht, welche die Funktionen

    void Spiel::Groesse_Spielfeld() (Zum abfragen der groesse des Spielfeldes);
    void Spiel::Spielfeld_Erstellen() (Zum erstellen des Spielfeldes; und
    void Spiel::Spielen() (Zum starten des Spieles (enthält die anderen Funktionen))

    enthält.
    Diese sind "public", sodass sie von der main-Funktion aufgerufen werden können.

    Dann habe ich noch die Membervariablen

    static const int max_Hoehe = 20; (maximum Hoehe)
    static const int max_Breite = 20; (maximum Breite)
    static const int min_Hoehe = 1; (minimum Hoehe)
    static const int min_Breite = 1; (minimum Breite)
    static int Hoehe; (Die Hoehe, die abgefragt wird)
    static int Breite; (Die Breite, die abgefragt wird)

    welche private sind, weil die ja nur die Memberfunktionen brauchen.

    In der Datei "Minesweeper.cpp" ist die main-Funktion.
    In der Datei "Programm.h" ist die Klasse "Spiel".
    Und in der Datei "Programm.cpp" ist die Definition der Funktionen der Klasse "Spiel".

    So, und nun der Quellcode:

    Programm.cpp:

    #include "Programm.h"
    #include <iostream>
    
    using namespace std;
    
    //Groesse_Spielfeld
    //
    //Funktion:	Groesse Spielfeld abfragen, testen
    void Spiel::Groesse_Spielfeld()
    {
    
    do
    {
    	cout<<"Hoehe muss im Bereich von "<<min_Hoehe<<" und "<<max_Hoehe<<" sein!"<<endl;
    	cout<<"Hoehe: ";
    	cin>> Hoehe;
    	if (Hoehe<min_Hoehe)
    	{
    		cout<<"Bitte geben Sie eine Zahl ueber 1 ein!"<<endl;
    	}
    	else if (Hoehe>max_Hoehe)
    	{
    		cout<<"Bitte geben Sie eine Zahl unter 20 ein!"<<endl;
    	}
    }while (Hoehe<min_Hoehe || Hoehe>max_Hoehe);
    
    do
    {
    	cout<<"Breite muss im Bereich von "<<min_Breite<<" und "<<max_Breite<<" sein!"<<endl;
    	cout<<"Breite: ";
    	cin>> Breite;
    	if (Breite<min_Breite)
    	{
    		cout<<"Bitte geben Sie eine Zahl ueber 1 ein!"<<endl;
    	}
    	else if (Breite>max_Breite)
    	{
    		cout<<"Bitte geben Sie eine Zahl unter 20 ein!"<<endl;
    	}
    }while (Breite<min_Breite || Breite>max_Breite);
    }
    
    //Spielfeld erstellen
    //
    //Funktion:	erstelle Spielfeld
    void Spiel::Spielfeld_Erstellen()
    {
    	for (int y= 0; y<Hoehe; y++)
    	{
    		for (int x= 0; x<Breite; x++)
    		{
    			cout<<"X";
    		}
    		cout<<endl;
    	}
    }
    void Spiel::Spielen()
    {
    	Groesse_Spielfeld();
    	Spielfeld_Erstellen();
    }
    

    **Programm.h:
    **

    class Spiel
    {
    private:
    	static const int max_Hoehe = 20;
    	static const int max_Breite = 20;
    	static const int min_Hoehe = 1;
    	static const int min_Breite = 1;
    	static int Hoehe;
    	static int Breite;
    
    public:
    void Groesse_Spielfeld();
    void Spielfeld_Erstellen();
    void Spielen();
    };
    

    **
    Minesweeper.cpp:**

    Minesweeper.cpp
    
    #include "Programm.h"
    
    int main()
    {
    	Spiel Spiel1;
    
    	Spiel1.Spielen();
    }
    

    Nun kommen 3 Fehlermeldungen auf:

    Error 1 error LNK2001: unresolved external symbol "private: static int Spiel::Breite" (? Breite@Spiel@@0PAHA) C:\Users\---------\Documents\Visual Studio 2010\Projects\Minesweeper\Minesweeper\Programm.obj

    Error 2 error LNK2001: unresolved external symbol "private: static int Spiel::Hoehe" (? Hoehe@Spiel@@0PAHA) C:\Users\------\Documents\Visual Studio 2010\Projects\Minesweeper\Minesweeper\Programm.obj

    Error 3 error LNK1120: 2 unresolved externals C:\Users\------\Documents\
    Visual Studio 2010\Projects\Minesweeper\Debug\
    Minesweeper.exe 1

    Ich habe lange gesucht, aber nichts gefunden, und wäre sehr dankbar auf eine Lösung.



  • Die Definition von Hoehe und Breite fehlt. Da sie static sind, musst du sie nochmal außerhalb der Klasse definieren.

    Aber warum sind die überhaupt static?



  • Der Compiler hat eine Fehlermeldung ausgespuckt, sodass ich (nach seiner Anweisung) die Variablen static gemacht habe.



  • Die Tuer schrieb:

    Der Compiler hat eine Fehlermeldung ausgespuckt, sodass ich (nach seiner Anweisung) die Variablen static gemacht habe.

    Ganz schlechte Idee.

    Ich bezweifle stark, dass der Compiler dich anweist, irgendwelche Variablen static zu machen.

    Dahinter sollte immer eine Designentscheidung stehen, nicht der Versuch, Compilerfehler zu beheben.

    Mach das static bei Hoehe und Breite weg. Wenn der Compiler dann meckert, stell die Fehlermeldung hier rein.



  • Entschuldigung, hab mich verlesen^^ der Compiler hatte nur gesagt, dass ich die const Variablen static machen soll^^
    Klappt jetzt wieder .
    Danke nochmal.



  • Was genau bringt eine Klasse, die nur static -Member beinhaltet?

    Und viel wichtiger: Was erreicht man, indem man sie auch noch instanziiert?



  • Um ehrlich zu sein, weiß ich nicht so genau, was static ist, ich hab das nur gemacht, als der Compiler mir das angemerkt hat 🙄 ... Ich bin halt noch ein totaler Anfänger...



  • static sagt, dass der entsprechende Member nur einmal pro Klasse und nicht pro Objekt existiert. Also gibt es die Breite, Höhe, etc. nur einmal, selbst wenn du von der Spiel -Klasse mehrere Instanzen erstellst. Die Instanziierung Spiel Spiel1 tut nämlich überhaupt nichts. Meine beiden Fragen zielten darauf ab, dass in dem Fall der Einsatz einer Klasse fehl am Platz ist. Du hättest ebenso eine Sammlung freier Funktionen nehmen können. Oder aber du machst alle Member nicht-statisch, was sich besonders lohnt, falls einmal mehrere Spiele koexistent sein können.

    Aber schreib keinen Code, den du überhaupt nicht verstehst, auch nicht auf Anweisung des Compilers. Wobei ich eher glaube, dass er was in der Art "nur statische integrale Konstanten dürften in der Klassendefinition initialisiert werden" ausgab. Aber wie schon von MFK bemerkt: Du solltest besser wissen, was du tust, als dein Compiler. Zumindest auf einer höheren Abstraktionsebene.



  • Danke! Werde ich mir merken


Anmelden zum Antworten