[c++] Odwołanie do funkcji klasowej - błąd

0

Robie sobie taki prosty program - "Bazodanowiec", ale napotkałem błąd.

plik main.cpp :

#include <iostream>
using namespace std;
#include "baza.h"
//deklaracje funkcji

int wybor(bool (*wsk_zatwierdz)  (int));
bool czy_dobra(int liczba);

int main(){
    cout<<"\n\n********** Bazowanowiec v.0.2 **************\n";
    cout<<"*     Co chcesz zrobic ?                   *\n";
    cout<<"*  1. Utworzyc baze danych.                *\n"           
        <<"*  2. Odczytac baze danych.                *\n"
        <<"*  3. Skasowac baze danych.                *\n"
        <<"*  4. Edytowac baze danych.                *\n"
        <<"*  5. Exit.                                *\n"
        <<"********************************************\n";
    int x;
    x = wybor(czy_dobra);
         
    switch (x){
          case 1:
             cout<<"Tworzymy\n";
             cout<<"Podaj nazwe bazy danych:";
             char naz[80];
             cin>> naz;
             baza pierwsza(char naz);
             pierwsza.wypisz();
             break;
             
          case 2:
             cout<<"Odczytujemy\n";
             break;
          case 3:
             cout<<"Kasujemy\n";
             break;
          case 4:   
             cout<<"Edytujemy\n";
             break;
          case 5:
             cout<<"No to koniec\n";
             break;
          }
}
//************************************
//funkcje
bool czy_dobra(int liczba){
     if (liczba == 1 || liczba == 2 || liczba == 3 || liczba == 4 || liczba ==5)
     {
         return true;
     }
     else
         cout<<"Blad !!! Zla opcja !!!\n"
             <<"Podaj prawidlowa opcje\n";
         return false;
}
int wybor(bool (*wsk_zatwierdz) (int) ) {
    int odpowiedz;
    bool zatwierdzone = true;
    do
    {
       cout<<"Podaj opcje:\n"
           <<">";
       cin>>odpowiedz;
       
       if(wsk_zatwierdz)
       {
       zatwierdzone = wsk_zatwierdz(odpowiedz);
       }
       else
       zatwierdzone = true;
    }while(!zatwierdzone);
    return odpowiedz;
}

Plik baza.h :

#ifndef BAZA_H_
#define BAZA_H_
//**************************************
//baza.h
//**************************************
#include <iostream>
using namespace std;
/////////////////////////////////////////////////////////////////////
class baza
{
          char plik_naz[85];
          char imie[80];
          char nazwisko[80];
   public:
          baza(char nazwa[80]);
          void wypisz();
};

#endif

i baza.cpp :

#include "baza.h"
#include<iostream>
using namespace std;
//***************************
void baza::baza(char nazwa[80]){
     plik_naz = nazwa;
}
void baza::wypisz(){
     cout<<plik_naz<<"\n";
}

Kompilator wywala : main.cpp: In function ‘int main()’:
main.cpp:28: error: request for member ‘wypisz’ in ‘pierwsza’, which is of non-class type ‘baza ()(char)’

Co robie źle ?

0

Robisz źle kilka rzeczy - przekazujesz tablicę poprzez kopię, nie przez wskażnik, próbujesz przepisać tablicę char'ów przypisaniem, w niewłaściwy sposób wywołujesz konstruktor.

baza pierwsza(char naz);

zmień na:

baza pierwsza(naz);

w baza.h
baza(char nazwa[80]);
na:
baza(char* nazwa);
w baza.cpp daj:

void baza::baza(char* nazwa)
{
     strncpy (plik_naz, nazwa, sizeof (plik_naz)-1);
}

ew. dołącz string.h w baza.cpp na początku:

#include <string.h> 

aaa... i to:

 if (liczba == 1 || liczba == 2 || liczba == 3 || liczba == 4 || liczba ==5)

zmień na coś bardziej cywilizowanego:

if ((liczba > 0) && (liczba < 6))

Tak na szybko więcej błędów nie widzę.

0

Tak w ogóle to nie baw się w tablice znaków tylko używaj stringa. Jest o wiele bardziej przyjazny użytkownikowi i nie sprawia tylu problemów.
Pozdrawiam

0

Zrobiłem jak powiedziałeś, ale teraz też nie działa, wydaje mi sie że coś z konstruktorem nie tak...

g++ :

main.cpp: In function ‘int main()’:
main.cpp:31: error: jump to case label
main.cpp:27: error:   crosses initialization of ‘baza pierwsza’
main.cpp:34: error: jump to case label
main.cpp:27: error:   crosses initialization of ‘baza pierwsza’
main.cpp:37: error: jump to case label
main.cpp:27: error:   crosses initialization of ‘baza pierwsza’
main.cpp:40: error: jump to case label
main.cpp:27: error:   crosses initialization of ‘baza pierwsza’
0

ach, przeoczyłem, że dałeś konstruktorowi typ, tego się nie robi... no i oklamerkowanie case'ów:
całość wygląda tak:
main.cpp

#include <iostream>
using namespace std;
#include "baza.h"
//deklaracje funkcji

int wybor(bool (*wsk_zatwierdz)  (int));
bool czy_dobra(int liczba);

int main()
{
	cout << "\n\n********** Bazowanowiec v.0.2 **************\n"
		<<"*     Co chcesz zrobic ?                   *\n"
		<<"*  1. Utworzyc baze danych.                *\n"           
		<<"*  2. Odczytac baze danych.                *\n"
		<<"*  3. Skasowac baze danych.                *\n"
		<<"*  4. Edytowac baze danych.                *\n"
		<<"*  5. Exit.                                *\n"
		<<"********************************************\n";
	int x;
	x = wybor(czy_dobra);

	switch (x)
	{
		case 1:
		{
			cout<<"Tworzymy\n";
			cout<<"Podaj nazwe bazy danych:";
			char naz[80];
			cin>> naz;
			baza pierwsza(naz);
			pierwsza.wypisz();
			break;
		}    
		case 2:
		{
			cout<<"Odczytujemy\n";
			break;
		}
		case 3:
		{
			cout<<"Kasujemy\n";
			break;
		}
		case 4:   
		{
			cout<<"Edytujemy\n";
			break;
		}
		case 5:
		{
			cout<<"No to koniec\n";
			break;
		}
	}
}
//************************************
//funkcje
bool czy_dobra(int liczba)
{
	if ((liczba > 0) && (liczba < 6))
		return true;
	else
		cout<<"Blad !!! Zla opcja !!!\n"
			<<"Podaj prawidlowa opcje\n";
	return false;
}
int wybor(bool (*wsk_zatwierdz) (int) ) 
{
	int odpowiedz;
	bool zatwierdzone = true;
	do
	{
		cout<<"Podaj opcje:\n"
			<<">";
		cin>>odpowiedz;

		if(wsk_zatwierdz)
			zatwierdzone = wsk_zatwierdz(odpowiedz);
		else
			zatwierdzone = true;
	}while(!zatwierdzone);
	return odpowiedz;
}

baza.cpp:

#include<iostream>
#include "baza.h"
using namespace std;
//***************************
baza::baza(char* nazwa)
{
	strncpy (plik_naz, nazwa, sizeof (plik_naz)-1);
}
void baza::wypisz()
{
	cout<<plik_naz<<"\n";
}

i baza.h

#ifndef BAZA_H_
#define BAZA_H_
//**************************************
//baza.h
//**************************************
/////////////////////////////////////////////////////////////////////
class baza
{
          char plik_naz[85];
          char imie[80];
          char nazwisko[80];
   public:
          baza(char* nazwa);
          void wypisz();
};

#endif

Zainteresuj się klasą string, znacznie wartościowsza od gołych tablic. Teraz już kod się kompiluje ładnie.

0

Tam pomyliłeś "chyba" nazwy plików baza.h z baza.cpp.....
Wstawiłem to twoje i g++ wypluwa:

/tmp/cc6SkXO9.o: In function `main':
main.cpp:(.text+0x249): undefined reference to `baza::baza(char*)'
main.cpp:(.text+0x257): undefined reference to `baza::wypisz()'
collect2: ld returned 1 exit status

co to jest to /tmp/cc6SkXO9.o :-|

0

a fakt... na szybko pisałem /jak zwykle ostatnio/ i takie cuda... poprawiłęm poprzedni post. Te błędy to błędy linkera - nie dołączasz bazy. Kompiluj:
g++ baza.cpp main.cpp -o program
Ew. kompiluj pojedyńcze pliki:
g++ plik.cpp -o plik.o
i linkuj:
ld pliki1.o plik2.o ...

co to jest to /tmp/cc6SkXO9.o

Plik tymczasowy tworzony przez gcc - używasz jak widać pierwszego sposobu kompilacji.

Ew. zrób projekt w jakimś IDE.

0

Działa, wielkie dzięki za pomoc [rotfl]
Nie wiedziałem że tak sie dołącza klase [wstyd]

1 użytkowników online, w tym zalogowanych: 0, gości: 1