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

Konstruktor zawiesza program

Object Storage Arubacloud
0 głosów
214 wizyt
pytanie zadane 23 sierpnia 2015 w C i C++ przez Jonki Dyskutant (8,180 p.)
edycja 23 sierpnia 2015 przez Jonki

Przy wyborze bohatera uruchamia się konstruktor i zawiesza program. Taki komunikat się pokazuje z debugera. http://zapodaj.net/6221d03683b14.png.html

main.cpp

#include <iostream>
#include "headlines.h"
#include <stdio.h>
#include <conio.h>
#include <windows.h>

using namespace std;

Game game;

int main()
{
    char wybor;

    cout << "\t" << "HERO" << endl << endl;
    cout << "1. New game" << endl;
    cout << "2. Load game" << endl << endl;

    cout << "Wybor: ";
    wybor = getch();

    switch(wybor)
    {
    case '1':
        {
            game.new_game();
            break;
        }
    case '2':
        {
            game.load_game();
            break;
        }
    default:
        {
            system("cls");
            cout << "Please input number!";
        }
    }

    return 0;
}

headlines.h

#include <iostream>

using namespace std;

typedef void v;

class Game
{
public:
    v new_game();
    v load_game();
};

class Heroes
{
protected:
    int HP, strength;

public:
    void lvl_up();
};

class Warrior :private Heroes
{
    int strength;

public:
    Warrior()
    {
        strength = 30;
        HP = 75;
    }

    ~Warrior(){}

    friend class Game;
};

class Wizard :private Heroes
{
public:
    Wizard()
    {
        strength = 15;
        HP = 100;
    }

    ~Wizard(){}

    friend class Game;
};

class Archer :private Heroes
{
public:
    Archer()
    {
        strength = 25;
        HP = 90;
    }

    ~Archer(){}

    friend class Game;
};

class Player :private Warrior, Wizard, Archer
{
    int HP, strength;

public:
    Player(int hp, int strength)
    : HP(hp), strength(strength)
    {}

    ~Player(){}
};

menu_functions.cpp

#include <iostream>
#include "headlines.h"
#include <windows.h>
#include <conio.h>
#include <stdio.h>

#define cls system("cls")

using namespace std;

Warrior *war;
Wizard *wiz;
Archer *arch;

void Game::new_game()
{
    char choose;

    cls;

    cout << "Choose your hero!" << endl << endl;
    cout << "1. Warrior" << endl;
    cout << "2. Wizard" << endl;
    cout << "3. Archer" << endl << endl;

    cout << "Choose: ";
    choose = getch();

    switch(choose)
    {
    case '1':
        {
            Player user(war -> HP, war -> strength);
        }
    case '2':
        {
            Player user(wiz -> HP, wiz -> strength);
        }
    case '3':
        {
            Player user(arch -> HP, arch -> strength);
        }
    }
}

void Game::load_game()
{

}

3 odpowiedzi

0 głosów
odpowiedź 23 sierpnia 2015 przez MrWeb Stary wyjadacz (10,200 p.)
wybrane 23 sierpnia 2015 przez Jonki
 
Najlepsza

menu_functions.cpp: linie 11..13 - tworzysz wskaźniki do poszczególnych klas, ale nigdy ich nie inicjalizujesz (nie ma alokacji pamięci, i nie wskazujesz ich na konkretne obiekty)

zmień te linijki na 

Warrior war;
Wizard wiz;
Archer arch;

i popraw wszystkie odwołania do składowych tych obiektów (zamień -> na . kropki)

komentarz 23 sierpnia 2015 przez Jonki Dyskutant (8,180 p.)
Pomogło, ale nie rozumiem dlaczego nie wyskoczył komunikat, że dane składowe klasy Warrior są prywatne.
komentarz 23 sierpnia 2015 przez Szykem2 Nałogowiec (29,510 p.)
Jeśli zmieniłeś na dziedziczenie publiczne to składniki są publiczne a obiekty nie istniały i temu ci wywalało program
komentarz 23 sierpnia 2015 przez Jonki Dyskutant (8,180 p.)

Dziedziczenie nie jest publiczne.

#include <iostream>
#include <stdio.h>

using namespace std;

typedef void v;

class Game
{
public:
    v new_game();
    v load_game();
};

class Heroes
{
protected:
    int HP, strength;

public:
    void lvl_up();
};

class Warrior :private Heroes
{
public:
    Warrior()
    {
        strength = 30;
        HP = 75;
    }

    ~Warrior(){}

    friend class Game;
};

class Wizard :private Heroes
{
public:
    Wizard()
    {
        strength = 15;
        HP = 100;
    }

    ~Wizard(){}

    friend class Game;
};

class Archer :private Heroes
{
public:
    Archer()
    {
        strength = 25;
        HP = 90;
    }

    ~Archer(){}

    friend class Game;
};

class Player :private Warrior, Wizard, Archer
{
    int HP, strength;

public:
    Player(int hp, int strength)
    : HP(hp), strength(strength)
    {}

    ~Player(){}
};

 

komentarz 23 sierpnia 2015 przez Szykem2 Nałogowiec (29,510 p.)
To nie wiem po co tu dziedzczenie poza dziedziczeniem Heroes <- Player pozostałe to mogą być klasy wyliczeniowe i będzie jeszcze łatwiej i przejrzyściej
komentarz 23 sierpnia 2015 przez MrWeb Stary wyjadacz (10,200 p.)
To wygląda jak implementacja przykładów z pierwszych sześciu odcinków obiektowego C++ Mirosława Zelenta, tam też były trzy klasy postaci (Archer, Warrior i Wizard) i na ich podstawie był prezentowany polimorfizm.
0 głosów
odpowiedź 23 sierpnia 2015 przez Szykem2 Nałogowiec (29,510 p.)
Zmień dziedziczenie na publiczne lub strzeżone bo w klasie Player dziedziczysz prywatne składniki z klas nadrzędnych a do prywatnych nie ma dostępu.
komentarz 23 sierpnia 2015 przez Jonki Dyskutant (8,180 p.)
Niestety nie pomogło.
komentarz 23 sierpnia 2015 przez Jonki Dyskutant (8,180 p.)

Taki komunikat się pokazuje z debugera. http://zapodaj.net/6221d03683b14.png.html

komentarz 23 sierpnia 2015 przez Szykem2 Nałogowiec (29,510 p.)
Przy wyborze postaci masz wskaźniki ale nie masz utworzonych obiektów
 nie do końca wiem co miałeś na myśli tworząc ten kod ale wydaje mi się że będzie dobrze dla każdej klasy postaci stwożyć zmienne statyczne HP i strength bo jak dziedziczysz to każdy w konstuktorów zmienia wartości tych atrybutów.
komentarz 23 sierpnia 2015 przez Szykem2 Nałogowiec (29,510 p.)
Na przyszłość dziel każdą klasę na inny plik .cpp i .h znacznie poprawia czytelność i ułatwia znalezienie ewentualnych błędów.
–1 głos
odpowiedź 23 sierpnia 2015 przez Patrycjerz Mędrzec (192,320 p.)
Podaj jakiś log, cokolwiek...
komentarz 23 sierpnia 2015 przez Jonki Dyskutant (8,180 p.)
Właśnie ten program poprawnie się kompiluje. Żadnych błędów. A jednak zamula konsole.

Podobne pytania

0 głosów
3 odpowiedzi 447 wizyt
0 głosów
0 odpowiedzi 77 wizyt
0 głosów
4 odpowiedzi 656 wizyt

92,580 zapytań

141,432 odpowiedzi

319,665 komentarzy

61,965 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...