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

Kompilator nie odnajduje konstruktora i desturuktora

Object Storage Arubacloud
–1 głos
326 wizyt
pytanie zadane 12 maja 2017 w C i C++ przez Eryk Chojnacki Obywatel (1,420 p.)

Piszę obiektowo w konsoli kółko i krzyżyk i gdy wszystko już zrobiłem i zdefiniowałem kompilator wykazuje mi błąd:

||=== Build: Debug in Kółko i krzyżyk konsola (compiler: GNU GCC Compiler) ===|
main.cpp||In function 'int main()':|
main.cpp|13|error: no matching function for call to 'Plansza::Plansza()'|
main.cpp|13|note: candidates are:|
Plansza.h|11|note: Plansza::Plansza(char, char, char, char, char, char, char, char, char)|
Plansza.h|11|note:   candidate expects 9 arguments, 0 provided|
Plansza.h|1|note: Plansza::Plansza(const Plansza&)|
Plansza.h|1|note:   candidate expects 1 argument, 0 provided|

 

Kod: 

main.cpp

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <conio.h>
#include "Plansza.h"
using namespace std;

int main()
{
    cout << "Zagrajmy w kolko i krzyzyk!" << endl;
    Plansza p1('n','n','n','n','n','n','n','n','n');
    p1.wyswietl();
    ~Plansza();
    return 0;
}

Plik.h

class Plansza
{
    char pole1, pole2, pole3, pole4, pole5, pole6, pole7, pole8, pole9;
public:
    void wyswietl();
    void gra();
    void wygrana();
    void remis();
    void odnowa();
    void wyjscie();
    Plansza(char, char, char, char, char, char, char, char, char);
    ~Plansza();
};

 

Plansza.cpp

 

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <conio.h>
#include "Plansza.h"
using namespace std;
bool won=false;


void wyswietl()
{
    //n oznacza nic
    cout<<"n|n|n"<<endl;
    cout<<"- - -"<<endl;
    cout<<"n|n|n"<<endl;
    cout<<"- - -"<<endl;
    cout<<"n|n|n"<<endl;
    pole1='n'; pole4='n'; pole7='n';
    pole2='n'; pole5='n'; pole8='n';
    pole3='n'; pole6='n'; pole9='n';
}
void gra()
{
    //"o" oznacza kólko, a "x" krzyzyk
    char tura='o';

    if(tura=='o')
    {
        switch(int nr_pola)
        {
            case 1:
                pole1='o';
                tura='x';
                break;
            case 2:
                pole2='o';
                tura='x';
                break;
            case 3:
                pole3='o';
                tura='x';
                break;
            case 4:
                pole4='o';
                tura='x';
                break;
            case 5:
                pole5='o';
                tura='x';
                break;
            case 6:
                pole6='o';
                tura='x';
                break;
            case 7:
                pole7='o';
                tura='x';
                break;
            case 8:
                pole8='o';
                tura='x';
                break;
            case 9:
                pole9='o';
                tura='x';
                break;
            default:
                cout<<"Niepoprawnie podany numer pola. Tracisz ruch"<<endl;
                tura='x';
        }

    }
    if(tura=='x')
    {
        switch(int nr_pola)
        {
            case 1:
                pole1='x';
                tura='o';
                break;
            case 2:
                pole2='x';
                tura='o';
                break;
            case 3:
                pole3='x';
                tura='o';
                break;
            case 4:
                pole4='x';
                tura='o';
                break;
            case 5:
                pole5='x';
                tura='o';
                break;
            case 6:
                pole6='x';
                tura='o';
                break;
            case 7:
                pole7='x';
                tura='o';
                break;
            case 8:
                pole8='x';
                tura='o';
                break;
            case 9:
                pole9='x';
                tura='o';
                break;
            default:
                cout<<"Niepoprawnie podany numer pola. Tracisz ruch"<<endl;
                tura='o';
        }
    }
    friend void wygrana();
    friend void remis();
}
void wygrana()
{
       if(pole1='o' && pole1==pole2 && pole2==pole3 ||
       pole4='o' && pole4==pole5 && pole5==pole6 ||
       pole7='o' && pole6==pole8 && pole8==pole9 ||
       pole1='o' && pole1==pole4 && pole4==pole7 ||
       pole2='o' && pole2==pole5 && pole5==pole8 ||
       pole3='o' && pole3==pole6 && pole6==pole9 ||
       pole1='o' && pole1==pole5 && pole5==pole9 ||
       pole3='o' && pole3==pole5 && pole5==pole7)
       {
            cout<<"Wygrywa kolko!"<<endl;
            cout<<"Nacisnij 'R', by zrestarowac gre "<<endl;
       }
       if(pole1='x' && pole1==pole2 && pole2==pole3 ||
       pole4='x' && pole4==pole5 && pole5==pole6 ||
       pole7='x' && pole6==pole8 && pole8==pole9 ||
       pole1='x' && pole1==pole4 && pole4==pole7 ||
       pole2='x' && pole2==pole5 && pole5==pole8 ||
       pole3='x' && pole3==pole6 && pole6==pole9 ||
       pole1='x' && pole1==pole5 && pole5==pole9 ||
       pole3='x' && pole3==pole5 && pole5==pole7)
       {
           cout<<"Wygrywa krzyzyk!"<<endl;
           cout<<"Nacisnij 'R', by zrestarowac gre "<<endl;
       }
       won=true;
    friend void gra()
}
void remis()
{
       if(pole1!='n' && pole4!='n' && pole7!='n' &&
       pole2!='n' && pole5!='n' && pole8!='n' &&
       pole3!='n' && pole6!='n' && pole9!='n' && won==false)
       {
            cout<<"Remis!"<<endl;
            cout<<"Nacisnij 'R', by zrestarowac gre "<<endl;
       }
}
void odnowa()
{
    if(getch()==82)
    {
    pole1='n'; pole4='n'; pole7='n';
    pole2='n'; pole5='n'; pole8='n';
    pole3='n'; pole6='n'; pole9='n';
    won=false;
    }
}
void wyjscie()
{
    if(getch()==27)
    {
        exit(0);
    }
}

Plansza::Plansza(char p1,char p2,char p3,char p4,char p5,char p6,char p7,char p8,char p9,)
{
    pole1=p1;
    pole2=p2;
    pole3=p3;
    pole4=p4;
    pole5=p5;
    pole6=p6;
    pole7=p7;
    pole8=p8;
    pole9=p9;
}
Plansza::~Plansza()
{
    cout<<endl;
}

 

Dlaczego tak się dzieje?

3 odpowiedzi

+3 głosów
odpowiedź 12 maja 2017 przez mokrowski Mędrzec (156,060 p.)
Ten kod nie ma prawa się kompilować poprawnie. Masz tu całe stado błędów składniowych:

1. Destruktor w main.cpp. Na rzecz jakiego obiektu go wywołujesz? Masz obiekt p1 i to na nim możesz (ale nie powinieneś) wywoływać destrukcję. Nie powinieneś jej wywoływać bo zostanie wywołania po opuszczeniu zakresu main() bo obiekt jest na stosie.

2. W pliku Plansza.cpp. Metody od wyświetl do odnowa powinny być poprzedzone nazwą klasy Plansza czyli nie odnowa() a Plansza::ondowa().

3. W nagłówku Plansza.h brakuje makr strażnika.

4. Używasz zmiennych globalnych (np. won) co jest błędem.

5. Instrukcja switch wymaga podania zmiennej bez jej deklaracji ( switch(nr_pola) a nie swich(int nr_pola) . Skąd wzięła się ta zmienna nr_pola?

6. friend nie w tym miejscu. Składniowo powinien być w pliku nagłówkowym...

7. Warunki && i || powinny być otoczone nawiasami bo są niejednoznaczne...

... Dalej już nie sprawdzam ..
0 głosów
odpowiedź 12 maja 2017 przez Wiciorny Ekspert (270,910 p.)
edycja 12 maja 2017 przez Wiciorny

Dodaj konstruktor domyślny 

Plansza();
Plansza(char, char, char, char, char, char, char, char, char);

dlaczego? Dlatego, że kompilator nie wie tak naprawdę  jakiego konstruktora ma użyć, bo mimo iż nie zapiszesz żadnego- zawsze przy tworzeniu obiektu, bedzie starać się korzystać z domyślnego.  [ MIMO , ŻE podałeś inny konstruktor z argumentami, i tylko jego wywołujesz] 

Jak @j23 wspomniał: nie wolno destruktora umieszczać w main 

 ~Plansza(); 

Swoją drogą dobrze zapisać destruktor 

 ~NumGame(){};

I jednego nie rozumiem, destruktor - czyśći czemu ty wywołujesz wypisanie nowych lini, to jest kod bez sensu. 

komentarz 12 maja 2017 przez Eryk Chojnacki Obywatel (1,420 p.)
Czyli co bym musiał zrobić, bo nie bardzo się orientuję?
1
komentarz 12 maja 2017 przez Dexterim Dyskutant (8,370 p.)
Kolejnymi błędami są deklaracja przyjaźni w pliku cpp i nie napisanie zasięgu klasy do metod. Jakim cudem kompilator Ci tego nie wyrzucił?
komentarz 12 maja 2017 przez Eryk Chojnacki Obywatel (1,420 p.)
Code::Blocks
komentarz 12 maja 2017 przez Eryk Chojnacki Obywatel (1,420 p.)
Swoją drogą ustawiając konstruktor na domyślny dostałem limit błędów, o tym że zmienne zadeklarowane w klasie nie są widziane w pliku .cpp
komentarz 12 maja 2017 przez Wiciorny Ekspert (270,910 p.)
ty pisałeś ten kod?  W ogóle . rozumiesz co się w nim dzieje, bo wydaje mi się- że nie bardzo... skoro podstawowych zależnosci nie znasz pomiedzy klasami, funkcjami.
komentarz 12 maja 2017 przez Eryk Chojnacki Obywatel (1,420 p.)
No pisałem ten kod, inaczej by mnie tu nie było. Dobra wrócę do nauki klas
0 głosów
odpowiedź 12 maja 2017 przez j23 Mędrzec (194,920 p.)
int main()
{
    ...
    ~Plansza(); // <--- Co to u diabła?!
    return 0;
}

 

komentarz 12 maja 2017 przez Wiciorny Ekspert (270,910 p.)
destruktor.... po prostu można go nie pisać, ale nie jest to dobra praktyka, więc po prostu jakby ktoś chciał coś dodatkowo usuwać w pamięci ;] np jak w grze aktualny stan gry- to przydaje się jego implementacja
komentarz 12 maja 2017 przez draghan VIP (106,230 p.)

po prostu można go nie pisać, ale nie jest to dobra praktyka, więc po prostu jakby ktoś chciał coś dodatkowo usuwać w pamięci ;]

...?

2
komentarz 12 maja 2017 przez j23 Mędrzec (194,920 p.)

@Wiciorny, to jest destruktor wewnątrz funkcji main. Kompilator traktuje to jak tworzenie nowego obiektu Plansza z domyślnym konstruktorem, którego nie ma.

komentarz 12 maja 2017 przez Wiciorny Ekspert (270,910 p.)

Matko święta @j23 - nie zauważyłem, że to plik MAIN- :D myślałem, że class. Zwaracam honor.

NATURALNIE- NIE MOŻNA TEGO UMIESZCZAĆ W MAIN 

 ~Plansza();

 

Podobne pytania

+1 głos
0 odpowiedzi 217 wizyt
pytanie zadane 13 października 2020 w JavaScript przez Artek Stary wyjadacz (11,800 p.)
0 głosów
0 odpowiedzi 149 wizyt
pytanie zadane 1 kwietnia 2020 w C# przez tonn204 Mądrala (7,440 p.)
0 głosów
1 odpowiedź 1,023 wizyt
pytanie zadane 21 stycznia 2019 w Python przez Dominoday Początkujący (420 p.)

92,632 zapytań

141,500 odpowiedzi

319,878 komentarzy

62,012 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!

...