Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

20.01.2008, 17:14

Problem wegen "undeclared identifier"

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include "Framework.hpp"
#include "Game.hpp"
#include "Menue.hpp"
#include <iostream>

int main (int argc, char *argv[])
{
    
    // Framework initialisieren

    if (g_pFramework->Init (800, 600, 16, true) == false)
    return (0);

    CMenue CMenue;

    //Menü initialisieren

    CMenue.Init ();
    CMenue.Render ();
    CMenue.Reset ();
    int action=0;
    action=CMenue.Position ();
    CMenue.Quit ();
    if (action==0)
    {
        // Neue Instanz des Spiels...

    }


Wenn ich das ganze dann kompilieren möchte erhalte ich die folgenden Fehler:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
--------------------Configuration: SDL_Game - Win32 Debug--------------------
Compiling...
main.cpp
C:\Programme\Asteroids\CPP DATEIEN\main.cpp(14) : error C2065: 'CMenue' : undeclared identifier
C:\Programme\Asteroids\CPP DATEIEN\main.cpp(14) : error C2146: syntax error : missing ';' before identifier 'CMenue'
C:\Programme\Asteroids\CPP DATEIEN\main.cpp(17) : error C2228: left of '.Init' must have class/struct/union type
C:\Programme\Asteroids\CPP DATEIEN\main.cpp(18) : error C2228: left of '.Render' must have class/struct/union type
C:\Programme\Asteroids\CPP DATEIEN\main.cpp(19) : error C2228: left of '.Reset' must have class/struct/union type
C:\Programme\Asteroids\CPP DATEIEN\main.cpp(21) : error C2228: left of '.Position' must have class/struct/union type
C:\Programme\Asteroids\CPP DATEIEN\main.cpp(22) : error C2228: left of '.Quit' must have class/struct/union type
Error executing cl.exe.

SDL_Game.exe - 7 error(s), 0 warning(s)


Ich bin mit meinem Latein am Ende. Kann mir vll jemand sagen was ich falsch mache??

Vielen Dank im voraus!

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

Frede

Treue Seele

Beiträge: 259

Wohnort: Hameln

Beruf: Schüler

  • Private Nachricht senden

3

20.01.2008, 17:45

Die Instanz darf nicht wie die Klasse heißen.
CMenue CMenue; geht somit nicht.

mfg Frede

4

20.01.2008, 20:25

ich werds probieren thx :D

aber nich mehr heute *im stehen einschlaf und umfall*

^^

glookie

DX9

unregistriert

5

21.01.2008, 09:07

Du kannst ja auch nicht so was schreiben:

C-/C++-Quelltext

1
int int;


;)

6

21.01.2008, 15:10

Nun nachdem ich die Namen geändert habe habe ich nur noch folgendes Problem:
kurz vor Ende des Linker Vorgangs erhalte ich folgende Meldung

Quellcode

1
2
3
4
5
6
7
--------------------Configuration: SDL_Game - Win32 Debug--------------------
Linking...
main.obj : error LNK2001: unresolved external symbol "public: __thiscall CMenue::CMenue(void)" (??0CMenue@@QAE@XZ)
Debug/SDL_Game.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

SDL_Game.exe - 2 error(s), 0 warning(s)


ich habe den ganzen Code nach CMenue::CMenue(void) durchsucht, jedoch nichts gefunden.
Wo könnte der Fehler stecken? Wenn ihr wollt könnt ihr die hpp und cpp Datei :arrow: HIER runterladen.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

21.01.2008, 15:13

Zitat von »"glookie1"«


ich habe den ganzen Code nach CMenue::CMenue(void) durchsucht, jedoch nichts gefunden.
Wo könnte der Fehler stecken? Wenn ihr wollt könnt ihr die hpp und cpp Datei :arrow: HIER runterladen.


Eben, das ist ja das Problem! :p Die fehlt die Definition des Standardkonstruktors. Schreib diese einfach in deine Moduldate (.cpp).

C-/C++-Quelltext

1
2
CMenue::CMenue()
{}


Oder nimm die Deklaration aus deiner Klassendefinition raus.
@D13_Dreinig

8

21.01.2008, 15:13

Hab wirklich keine Lust mir den Code anzugucken. Aber wahrscheinlich hast du da irgendwie sowas:

C-/C++-Quelltext

1
2
3
4
5
6
7
class CMenue
{
// ...

public:
    CMenue();
// ...

};
und wie du dann ja schon gesagt hast, in der Source-Datei kein CMenue::CMenue(). D.h. du hast den Konstruktor Deklariert aber nicht definiert. Das meckert der Linker nun an, da er jetzt Definition und Deklaration braucht.
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

9

21.01.2008, 15:21

Danke!!

Jetzt funktioniert's!!
:shock: Muss wahrscheinlich nochmal das Buch durcharbeiten *g*

cu

10

21.01.2008, 15:39

So, doch schnell nen Blick auf deinen Code geworfen ;)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void CMenue::Init ()
{
  // Menüsprite erstellen

  m_pSpriteMenue = new CSprite;

  m_pSpriteMenue->Load ("Data/Hauptmenü.bmp", 0, 800,600);
  m_pSpriteMenue->SetColorKey (255, 0, 255);

  // Zeiger-Sprite erstellen

  m_pSpritePoint = new CSprite;

  m_pSpritePoint->Load ("Data/Zeiger.bmp", 0, 64, 64);
  m_pSpritePoint->SetColorKey (255, 0, 255);

} // Init
Warum packst du das nicht in den Konstruktor? Der wird nunmal beim erstellen des Objektes aufgerufen!

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void CMenue::Quit ()
{
  // Hauptmenü-Sprite freigeben

  if (m_pSpriteMenue != NULL)
  {
    delete (m_pSpriteMenue);
    m_pSpriteMenue = NULL;
  }

  // Zeiger-Sprite freigeben

  if (m_pSpritePoint != NULL)
  {
    delete (m_pSpritePoint);
    m_pSpritePoint = NULL;
  }

} // Quit
Das gehört in den Destruktor! Dann kannst du auch den Aufruf von Quit sparen, da der Destruktor immer (okay fast) beim Zerstören des Objektes aufgerufen wird.

delete NULL ist i.o. und macht einfach garnix.(Laut Standard ...) Von d.h. ist es sinnlos auf NULL zu prüfen!

Dann ist deine Funktion Position sehr kritisch!

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
int CMenue::Position ()
{
    int Position=0;

    if (Position==0)
    {
        return 0;
    }
    else if (Position==1)
    {
        return 1;
    }
    else if (Position==2)
    {
        return 2;
    }
    else
    {
        if (Position>2)
        {
            Position=2;
        }
        else if (Position<0)
        {
            Position=0;
        }
    }
    return -2;
}
. Im Idealfall wird es auf int CMenue::Position () { return 0; } optimiert. Das ist im Grunde alles was in deiner Funktion passiert ;) Wenn die Funktion abgearbeitet wird, wird das Objekt Position zerstört! (davon mal abgesehen das "Position" sowohl als Funktionsname als auch als Bezeichner zu nutzen nicht unbedingt so schlau ist ;) ).

Dann

C-/C++-Quelltext

1
2
3
4
5
6
else
  {
    // Animation zurück zum Ausgangspunkt

    /*Einfach Nichts tun...*/
    m_fYPos+=0;
  }
ehm ja, dann mach auch einfach nichts und lass den kompletten Ast weg!

Du kommentierst viel unnötig. Benutzt eindeutige Bezeichner für Variablen und Funktionen und kommentier nur Festewerte und komplexe algorithmen. Was selbsterklärend ist, muss nicht kommentiert werden!

Vllt auch werte die zusammengehören in ein std::pair packen ... z.B. bei positionen ...

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#if !defined(MENU_HPP__INCLUDED)
#define MENU_HPP__INCLUDED

#if (_MSC_VER >= 1000)
#pragma once
#endif // (_MSC_VER >= 1000)


#include "Sprite.hpp"
#include "Shot.hpp"
#include <utility>

typedef std::pair<float, float> position_t;

class Menu  
{
    CSprite*    m_background;
    CSprite*    m_pointer;
    position_t  m_position;

public:
    Menu();
    ~Menu()

public:
    void    reset ();
    int     position ();
    void    render();
    void    update();

private:
    void    process_shooting();
};

#endif // MENU_HPP__INCLUDED

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include "Menu.hpp"

Menu::Menu()
    : m_background(new CSprite), m_pointer(new CSprite)
{
    m_background->Load("Data/Hauptmenü.bmp", 0, 800,600);
    m_background->SetColorKey(255, 0, 255);
    m_pointer->Load("Data/Zeiger.bmp", 0, 64, 64);
    m_pointer->SetColorKey (255, 0, 255);
}

Menu::~Menu()
{
    delete m_background;
    delete m_pointer;
}

void Menu::reset()
{
    // P(200.0f, 200.0f) start position

    m_position = std::make_pair(200.0f, 200.0f);
}

int Menu::position()
{
    // TODO: Funktion neu schreiben. Inkorrektes verhalten!

}

void Menu::render()
{
    m_pointer->SetPos(m_position.first, m_position.second);
    m_pointer->Render(m_fAnimPhase);
}

void Menu::update()
{
    // move cursor

    if (g_pFramework->KeyDown(SDLK_UP))
        m_position.second += 10;
    else if (g_pFramework->KeyDown (SDLK_DOWN))
        m_position.second -= 10;

    // check x coord to be valid

    if (m_position.first < 200.f)
        m_position.first = 200.f;
    else if (m_position.first >= 240.f)
        m_position.first = 240.f;
}
wobei ich an deiner Stelle mal das Klassendesign von Sprite überdenken würde und auch Menu nicht so statisch machen würde. Ließ die Größe deines Menüs aus der Datei aus usw., lass dir die zu ladende Datei als Parameter im Konstruktor angeben ... . Dann ist das alles ein wenig dynamischer!
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Werbeanzeige