• 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

VPS Starter Arubacloud
0 głosów
260 wizyt
pytanie zadane 3 grudnia 2016 w C i C++ przez pewien_programista Obywatel (1,070 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 (39,560 p.)
wybrane 3 grudnia 2016 przez pewien_programista
 
Najlepsza
Zrób forward declaration klas MenuItem i Color.
komentarz 3 grudnia 2016 przez pewien_programista Obywatel (1,070 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 (39,560 p.)
Forward declaration odpada pokaż mi te 3 pliki nagłówkowe.
komentarz 3 grudnia 2016 przez pewien_programista Obywatel (1,070 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 (39,560 p.)
No i pokaż jeszcze main'a
komentarz 3 grudnia 2016 przez pewien_programista Obywatel (1,070 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 (39,560 p.)
Usuń include'a z submenuitem z pliku menu.h
komentarz 3 grudnia 2016 przez pewien_programista Obywatel (1,070 p.)
nie ma żadnych zmian... błąd jaki był taki jest... :/
1
komentarz 3 grudnia 2016 przez unknown Nałogowiec (39,560 p.)
Jeszcze z menuitem.h usuń tego samego include'a. Nie zauważyłem go wcześniej.
komentarz 3 grudnia 2016 przez pewien_programista Obywatel (1,070 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ź 113 wizyt
pytanie zadane 11 grudnia 2015 w C i C++ przez Ditrix Mądrala (5,650 p.)
0 głosów
1 odpowiedź 231 wizyt
pytanie zadane 25 października 2015 w C i C++ przez Mavimix Dyskutant (8,390 p.)

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...