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

C++ dyrektywy, błąd "zagnieżdżone zbyt głęboko"

Object Storage Arubacloud
0 głosów
242 wizyt
pytanie zadane 23 października 2016 w C i C++ przez Ditrix Mądrala (5,650 p.)

Witam!

Mój program ogólnie składa się z 5 plików. Kompilator pokazał mi błąd

D:\Projekty\c++\Snake\snake.h:3:19: error: #include nested too deeply

I tak dla każdego pliku nagłówkowego. Wiem mniej więcej o co chodzi. Program się gubi, ponieważ kilka razy musi odpalać na nowo ten sam plik. Czytałem kiedyś o dyrektywach #define, #endif, ale nie za bardzo wiem jak się z nich korzysta. A na internecie nie mogę niczego znaleźć. Jakby ktoś mógł mi objaśnić jak je użyć poprawnie :)

2 odpowiedzi

0 głosów
odpowiedź 23 października 2016 przez Evelek Nałogowiec (28,960 p.)
wybrane 23 października 2016 przez Ditrix
 
Najlepsza

Chodzi prawdopodobnie o to, że dany plik nagłówkowy z prototypami funkcji dodajesz kilkakrotnie do różnych innych plików w swoim projekcie.

Proponuje takie rozwiązanie: w plikach z nagłówkami klas robisz tak:

#ifndef PLIK_H_
#define PLIK_H_

//od tego momentu twoja klasa, prototypy funkcji itd.:

class nazwa_klasy
{
...
}

//a tu na zakończenie zapisujesz tak:

#endif

 

komentarz 23 października 2016 przez Ditrix Mądrala (5,650 p.)
Wszystkie załączone biblioteki przed czy po #define ?
komentarz 23 października 2016 przez Ditrix Mądrala (5,650 p.)
Dobra problem rozwiązany. Ale mam jeszcze inny, jakbyś mógł. Zrobiłem osoby plik do każdej klasy, po to, aby się widziały na wzajem. Jednak tak się nie dzieje. Jedna klasa widzi drugą, ale druga nie widzi tej pierwszej. Jak to naprawić ? Wkleić kod ?
komentarz 23 października 2016 przez Evelek Nałogowiec (28,960 p.)
Możesz jakiś fragment wkleić, przyjrzę się, jak jest zbudowana jedna klasa, jak druga i napisz gdzie dokładnie jest problem.
komentarz 24 października 2016 przez Ditrix Mądrala (5,650 p.)
Pierwsza klasa C_table
#ifndef TABLE_H_
#define TABLE_H_

#include "snake.h"
#include "oclock.h"
#include <iostream>
#include <list>

using namespace std;

class C_table
{
private:
    string tab[15][30];
    struct fruit
    {
        int x;
        int y;
        string sign;
        fruit(int send_x, int send_y, string send_sign="*") : x(send_x), y(send_y), sign(send_sign){};
    };

    list<fruit>tab_fruit;
    list<fruit>::iterator it_f;
public:
    C_table();

    void random();
    void come_across_points(C_snake& object);
    bool end_game(const C_snake& object);
    void update_table(int send_x, int send_y,char send_director);
    void show(const C_snake& object);
};

#endif

Druga klasa C_snake

#ifndef SNAKE_H_
#define SNAKE_H_

#include "table.h"
#include "oclock.h"
#include <iostream>
#include <list>

using namespace std;

class C_snake
{
private:
    struct S_position
    {
        int x;
        int y;
        char director;

        S_position(int send_x, int send_y, char send_director)
        {
            x = send_x;
            y = send_y;
            director = send_director;
        }
        bool operator=(const S_position st1)
        {
            if(st1.x==x && st1.y==y)
                return true;
            else
                return false;
        }
        friend int return_add_x_to_new_object(list<S_position>::iterator it)
        {
            it--;
            if(it->director=='l')
                return it->x++;
            else if(it->director=='r')
                return it->x--;
            else
                return it->x;
        }
        friend int return_add_y_to_new_object(list<S_position>::iterator it)
        {
            it--;
            if(it->director=='u')
                return it->y--;
            else if(it->director=='d')
                return it->y++;
            else
                return it->y;
        }
        friend return_add_director_to_new_object(list<S_position>::iterator it)
        {
            it--;
            return it->director;
        }
        friend int return_add_y_to_move_object(list<S_position>::iterator it)
        {
            it--;
            if(it->director=='u')
                return it->y++;
            else if(it->director=='d')
                return it->y--;
            else
                return it->y;
        }
        friend int return_add_x_to_move_object(list<S_position>::iterator it)
        {
            it--;
            if(it->director=='l')
                return it->x--;
            else if(it->director=='r')
                return it->x++;
            else
                return it->x;
        }

    };
    list<S_position>tab_position;
    list<S_position>::iterator i_p;
    list<S_position>::iterator i_p2;
    list<S_position>::iterator first;
    int points=0;
public:
    C_snake(int send_x, int send_y, char send_director);

    void add_point()
    {
        points++;
    }
    void add_back();
    bool move_first_object(char send_director);
    void move_position();
    bool colision();
    void write(C_table& object);
    int return_first_x()
    {
        i_p = tab_position.begin();
        return i_p->x;
    }
    int return_first_y()
    {
        i_p = tab_position.begin();
        return i_p->y;
    }
    int return_first_director()
    {
        i_p = tab_position.begin();
        return i_p->director;
    }
};

#endif

No i po kompilacji wyskakuję błąd w tej linijce

void write(C_table& object);

Mówiący iż C_table nie jest zadeklarowane. Spowodowane tym, że C_snake nie widzi C_table. Nie wiem czy kombinować to w inny sposób czy da radę to jakoś naprawić w tej postaci jaka jest. Zadam pytanie dla jasności. Czy jest możliwe, żeby każda klasa widziała się nawzajem ?

komentarz 25 października 2016 przez Evelek Nałogowiec (28,960 p.)
Nie wiem, nie pomogę Ci z tym problemem. Jeszcze nie jestem wystarczająco dobry. Proponuje nowy temat, aby użytkownicy zobaczyli i zawsze się ktoś znajdzie, co doradzi i pomoże.
+1 głos
odpowiedź 23 października 2016 przez Radfler VIP (101,030 p.)
Plik nagłówkowe w Twoim programie załączają się wzajemnie w nieskończoność, a kompilator nie może sobie z tym poradzić. Spróbuj wykorzystać deklarację klasy zamiast załączania całego pliku nagłówkowego.

Podobne pytania

+1 głos
0 odpowiedzi 312 wizyt
+1 głos
2 odpowiedzi 957 wizyt
pytanie zadane 22 stycznia 2021 w C i C++ przez Karson Obywatel (1,000 p.)
0 głosów
3 odpowiedzi 1,003 wizyt
pytanie zadane 2 maja 2020 w Python przez lenzo1 Początkujący (360 p.)

92,555 zapytań

141,403 odpowiedzi

319,559 komentarzy

61,940 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!

...