• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed [c++] dziwny błąd w programie

0 głosów
53 wizyt
pytanie zadane 3 grudnia 2016 w C i C++ przez pewien_programista Użytkownik (820 p.)
zamknięte 3 grudnia 2016 przez pewien_programista

Witam!

Mam pewien problem, mianowicie tworzę prostą gierkę konsolową, w której jest proste menu. Wszystko działało dopóki nie zabrałem się za podmenu. Fragment kodu który zwraca błąd to:

#ifndef SUBMENUITEM_H
#define SUBMENUITEM_H

#include <iostream>
#include "menuitem.h"
#include "menu.h"
#include "color.h"
class Menu;

class SubmenuItem :public MenuItem, public Color
{
    Menu* menu;
public:
    SubmenuItem(Menu*, std::string="Napis", int=GRAY, int=BLACK, int=GRAY, int=BLACK);
    ~SubmenuItem();
    void menu_start();
};

#endif // SUBMENUITEM_H

a konkretnie linijka, w której jest zapis dziedziczenia. Błąd ma treść "error: expected class-name before ',' token". Pragnę tu zaznaczyć, że wszystkie nazwy klas są na 110% poprawne. Nie mam pojęcia o co chodzi. Proszę o szybką odpowiedź, z góry dziękuję.

komentarz zamknięcia: Problem został rozwiązany

1 odpowiedź

+1 głos
odpowiedź 3 grudnia 2016 przez unknown Nałogowiec (29,880 p.)
wybrane 3 grudnia 2016 przez pewien_programista
 
Najlepsza
Zrób forward declaration klas MenuItem i Color.
komentarz 3 grudnia 2016 przez pewien_programista Użytkownik (820 p.)
wtedy wyskakują 2 błędy:
error: invalid use of incomplete type 'class MenuItem'
error: forward declaration of 'class MenuItem'
1
komentarz 3 grudnia 2016 przez unknown Nałogowiec (29,880 p.)
Forward declaration odpada pokaż mi te 3 pliki nagłówkowe.
komentarz 3 grudnia 2016 przez pewien_programista Użytkownik (820 p.)

Menu.h
 

#ifndef MENU_H
#define MENU_H

#include "menuitem.h"
#include "submenuitem.h"
#include <vector>
class SubmenuItem;
class Menu
{
    bool isStarted;
    std::vector<MenuItem*> item; //lista opcji
    std::vector<int> option_table; //id opcji do wywolania
    int options_number; //ilosc opcji
    int choose; //obecnie wybrana opcja
    int options; //ilosc opcji
    int selected_color;
    int selected_background_color;
    //kolor tekstu i tla wybranej opcji
    void resetuj_kolor(MenuItem*); //resetuje kolory konsoli
    void wypisz(); //wypisywanie listy pocji
    void loop(); //petla menu
    void function_execution(int, MenuItem*); //wybieranie ktora funkcje wybrac
    bool isStatic(int); //sprawdzanie czy element mozna wybrac
    //funckje wykonywane przez function_execution
    void close_application(); //zamykanie aplikacji
    void start_game(); //rozpoczecie / restart gry
    void activate_submenu(MenuItem*); //wywolywanie submenu
    //koniec funkcji wykonywanych przez function_execution
public:
    Menu(int=0, int=Color::WHITE, int=Color::BLACK);
    ~Menu();
    //konstruktor i destruktor
    void menu_start();
    //rozpoczecie petli menu
    void addMenuItem(MenuItem*, int);
    //dodawanie opcji do menu
    void addSubmenu(SubmenuItem*, int);
    //dodawanie podmenu
    enum OPTIONS
    {
        STATIC_ELEMENT = -1,
        CLOSE_APPLICATION = 0,
        START_GAME,
        SUBMENU
    };
};

#endif // MENU_H

MenuItem.h:

#ifndef MENUITEM_H
#define MENUITEM_H

#include <iostream>
#include "color.h"
#include "submenuitem.h"

class MenuItem :public Color
{
    std::string text; //tekst opcji w menu
    int number; //numer opcji
public:
    MenuItem(std::string="Napis", int=GRAY, int=BLACK, int=GRAY, int=BLACK);
    ~MenuItem();
    //konstruktor i destruktor
    void reset_color();
    void change_color();
    //ustawianie koloru tekstu
    void setNumber(int);
    int getNumber();
    void setText(std::string);
    std::string getText();
    //gettery i settery
};

#endif // MENUITEM_H

Menu.h:

#ifndef MENU_H
#define MENU_H

#include "menuitem.h"
#include "submenuitem.h"
#include <vector>
class SubmenuItem;
class Menu
{
    bool isStarted;
    std::vector<MenuItem*> item; //lista opcji
    std::vector<int> option_table; //id opcji do wywolania
    int options_number; //ilosc opcji
    int choose; //obecnie wybrana opcja
    int options; //ilosc opcji
    int selected_color;
    int selected_background_color;
    //kolor tekstu i tla wybranej opcji
    void resetuj_kolor(MenuItem*); //resetuje kolory konsoli
    void wypisz(); //wypisywanie listy pocji
    void loop(); //petla menu
    void function_execution(int, MenuItem*); //wybieranie ktora funkcje wybrac
    bool isStatic(int); //sprawdzanie czy element mozna wybrac
    //funckje wykonywane przez function_execution
    void close_application(); //zamykanie aplikacji
    void start_game(); //rozpoczecie / restart gry
    void activate_submenu(MenuItem*); //wywolywanie submenu
    //koniec funkcji wykonywanych przez function_execution
public:
    Menu(int=0, int=Color::WHITE, int=Color::BLACK);
    ~Menu();
    //konstruktor i destruktor
    void menu_start();
    //rozpoczecie petli menu
    void addMenuItem(MenuItem*, int);
    //dodawanie opcji do menu
    void addSubmenu(SubmenuItem*, int);
    //dodawanie podmenu
    enum OPTIONS
    {
        STATIC_ELEMENT = -1,
        CLOSE_APPLICATION = 0,
        START_GAME,
        SUBMENU
    };
};

#endif // MENU_H

Color.h, tu pewnie nie tkwi problem, ale:

#ifndef COLOR_H
#define COLOR_H

class Color
{
    int default_color;
    int default_background_color;
    int draw_color;
    int draw_background_color;
    //kolory tekstu i tla
public:
    enum COLOR
    {
        BLACK = 0,
        DARKBLUE,
        DARKGREEN,
        DARKCYAN,
        DARKRED,
        DARKMAGNETA,
        DARKYELLOW,
        GRAY,
        DARKGRAY,
        BLUE,
        GREEN,
        CYAN,
        RED,
        MAGNETA,
        YELLOW,
        WHITE
    };
    //wartosci dla kolorow
    Color(int=GRAY, int=BLACK, int=GRAY, int=BLACK);
    ~Color();
    //konstruktor i destruktor
    void paint(int, int); //zmienianie koloru tekstu
protected:
    void setDefaultColor(int);
    void setDefaultBackgroundColor(int);
    void setDrawColor(int);
    void setDrawBackgroundColor(int);
    int getDefaultColor();
    int getDefaultBackgroundColor();
    int getDrawColor();
    int getDrawBackgroundColor();
    //gettery i settery
};

#endif
1
komentarz 3 grudnia 2016 przez unknown Nałogowiec (29,880 p.)
No i pokaż jeszcze main'a
komentarz 3 grudnia 2016 przez pewien_programista Użytkownik (820 p.)

Main, przenosi od razu do Game.cpp, oto ona:

#include <iostream>
#include "player.h"
#include "coin.h"
#include "enemy.h"
#include "coursor.h"
#include "virtualkeys.h"
#include "menu.h"
#include <time.h>
#include <cstdlib>
#include <windows.h>
#include <vector>
#include <stdlib.h>
#include <conio.h>
#include "game.h"
#include "functions.h"
#include "submenuitem.h"

using namespace std;

Game::Game()
{
    game();
}

Game::~Game() {}

int Game::random(int x)
{
    return rand()%x + 1;
}

void Game::game()
{
    SMALL_RECT r;
    r.Left = 0;
    r.Top = 0;
    r.Right = 63;
    r.Bottom = 24;
    //kwadrat okreslajacy wielkosc okna konsoli
    COORD console_size;
    console_size.X = 63;//liczba komorek (poziom)
    console_size.Y = 24;//liczba komorek (pion)
    SetConsoleScreenBufferSize(GetStdHandle( STD_OUTPUT_HANDLE ),console_size);
    SetConsoleWindowInfo(GetStdHandle( STD_OUTPUT_HANDLE ), TRUE, &r );
    //zmiana ilosci komorek konsoli
    system("title Collector");
    //zmiana tytulu okna

    while (true)
    {
        /* kod destowy */
        Menu* m = new Menu(0, Color::BLUE, Color::WHITE);
        m->addMenuItem(new MenuItem("Witaj, zostales wybrany\nczujesz sie wyjatkowy?", Color::BLACK, Color::GRAY), Menu::STATIC_ELEMENT);
        m->addMenuItem(new MenuItem("TAK :D", Color::BLUE, Color::WHITE), Menu::START_GAME);
        m->addMenuItem(new MenuItem("NIE :(", Color::BLUE, Color::WHITE), Menu::START_GAME);
        /* kod testowy */
        Menu* menu = new Menu(0, Color::BLUE, Color::WHITE);
        //wywolanie menu
        menu->addMenuItem(new MenuItem("start", Color::BLUE, Color::WHITE), Menu::START_GAME);
        /* kod testowy */
        menu->addSubmenu(new SubmenuItem(m, "test", Color::BLUE, Color::WHITE), Menu::SUBMENU);
        /* kod testowy */
        menu->addMenuItem(new MenuItem("wyjdz", Color::BLUE, Color::WHITE), Menu::CLOSE_APPLICATION);
        //dodawanie opcji menu
        menu->menu_start();
        //start menu
        delete menu;
        //usuwanie wskaznika menu
        Coursor* cu = new Coursor(0, 0, Color::GREEN);
        //tworzenie "kursora"
        vector<Enemy*> enemies;
        //lista przeciwnikow
        srand(time(NULL));
        //rozpoczecie losowania liczb calkowitych
        int tps = 15;
        //ilosc tickow na sekunde
        enemies.push_back(new Enemy('r', 1, 2, 'O', random(64), random(25), random(2)));
        //tworzenie pierwszego przeciwnika
        Coin* c = new Coin('O', random(64), random(25));
        //tworzenie monety
        Player* p = new Player(1, 'r', 0, 'X', random(64), random(25), Color::WHITE,
         Color::WHITE);
        //tworzenie gracza
        while(p->getHealth() > 0)
        {
            cu->clear_console();
            //czyszczenie okna konsoli
            if(c->isCollected()) //jesli gracz zdobedzie punkt
            {
                enemies.push_back(new Enemy('r', 1, 2, 'O', random(64), random(25), random(2)));
                //tworzenie nowego przeciwnika
                cout << "\a"; //odtworz pikniecie
            }
            for(int i=0; i < enemies.size(); i++)
            {
                enemies[i]->tick(p);
                enemies[i]->draw();
            }
            //ruch i pokazywanie na ekranie przeciwnikow
            p->tick();
            p->draw();
            //ruch i pokazywanie na ekranie gracza
            c->tick(p, random(64), random(25));
            c->draw();
            //pokazywanie na ekranie monety i losowanie jej nowego polozenia
            Sleep(1000/tps);
            //ustalanie predkosci petli
        }
        //petla gry
        for(int i=enemies.size()-1; i >= 0; i--)
        {
            delete enemies[i];
            enemies.pop_back();
        }

        menu = new Menu(2);
        string x = "Twoje punkty: " + toString(p->getPoints());
        menu->addMenuItem(new MenuItem("Przegrales", Color::GREEN, Color::BLACK, Color::GREEN), Menu::STATIC_ELEMENT);
        menu->addMenuItem(new MenuItem(x, Color::GREEN, Color::BLACK, Color::GREEN), Menu::STATIC_ELEMENT);
        menu->addMenuItem(new MenuItem("restart", Color::BLUE, Color::WHITE, Color::RED), Menu::START_GAME);
        menu->addMenuItem(new MenuItem("wyjdz", Color::BLUE, Color::WHITE, Color::RED), Menu::CLOSE_APPLICATION);
        menu->menu_start();
        delete menu;
        /*char znak;
        do
        {
            cu->clear_console();
            cu->gotoxy(0, 0);
            cu->display("Przegrales! \nTwoje punkty: ");
            cu->display(p->getPoints());
            cu->display("\nWcisnij ENTER aby zagrac jeszcze raz");
            cu->display("\nlub ESC aby wyjsc z gry");
            znak = getch();
        } while (znak != KB_ENTER && znak != KB_ESCAPE); //powtarzaj dopuki znak nie jest rowny ENTER
        //wyswietlanie tekstu na koncu gry
        if(znak == KB_ESCAPE) break;*/
        delete p; //usuwanie wskaznika gracza
    }
}

 

1
komentarz 3 grudnia 2016 przez unknown Nałogowiec (29,880 p.)
Usuń include'a z submenuitem z pliku menu.h
komentarz 3 grudnia 2016 przez pewien_programista Użytkownik (820 p.)
nie ma żadnych zmian... błąd jaki był taki jest... :/
1
komentarz 3 grudnia 2016 przez unknown Nałogowiec (29,880 p.)
Jeszcze z menuitem.h usuń tego samego include'a. Nie zauważyłem go wcześniej.
komentarz 3 grudnia 2016 przez pewien_programista Użytkownik (820 p.)
Dziękuję, ten błąd się naprawił :) Pojawiły się inne, ale je już chyba dam radę rozwiązać :)

Podobne pytania

0 głosów
1 odpowiedź 45 wizyt
pytanie zadane 11 grudnia 2015 w C i C++ przez Ditrix Gaduła (4,310 p.)
0 głosów
1 odpowiedź 80 wizyt
pytanie zadane 25 października 2015 w C i C++ przez Mavimix Gaduła (4,070 p.)
...