Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] "Dynamiczna alokacja pamięci. "

Ostatnio zmodyfikowano 2019-05-15 09:40
Autor Wiadomość
ayya
Temat założony przez niniejszego użytkownika
[C++] "Dynamiczna alokacja pamięci. "
» 2019-05-14 23:17:01
Witam, mam problem z kodem a mianowicie "casem 3" gdzie nie mam pojęcia co oznacza pokazany błąd. Próbowałem już wiele kombinacji, jednak nic nie zadziałało. Opcja ma wyświetlać dane, czyli po ich wcześniejszym usunięciu powinny wyskoczyć jakieś śmieci?
Treść błędu:
main.cpp|40|error: request for member 'wyswietl' in '*(osoby + ((sizetype)(((unsigned int)i) * 4u)))', which is of pointer type 'baza*' (maybe you meant to use '->' ?)|

C/C++
main.cpp
#include <iostream>
#include "klasa.h"
#include <fstream>
#include <cstdlib>

using namespace std;
int main()
{
    class baza ** osoby = NULL;
    int i;
    char znak;
    cout <<( "\nMenu" );
    cout <<( "\n1. Pobierz dane" );
    cout <<( "\n2. Usun dane" );
    cout <<( "\n3. Wyswietl dane" );
    cout <<( "\n4. Koniec" );
   
    do
    {
        fflush( stdin );
        printf( "\nWybor: " );
        scanf( "%c", & znak );
        switch( znak )
        {
        case '1':
            osoby = new baza *[ 3 ];
            for( int i = 0; i < 3; i++ ) {
                osoby[ i ] = new baza( "Adam", "Nowak", "1" ); }
            break;
           
        case '2':
            for( int i = 0; i < 3; i++ ) {
                delete osoby[ i ]; }
            delete[] osoby;
            break;
        case '3':
           
            for( int i = 0; i < 3; i++ )
                 osoby = new baza *[ 3 ];
           
            osoby[ i ].wyswietl();
           
            break;
           
           
           
        }
    }
    while( znak != '4' );
   
    return 0;
};

klasa.cpp

#include <iostream>
#include "klasa.h"
#include <fstream>
#include <string.h>

using namespace std;
void baza::wyswietl( const char * i, const char * n, const char * t ) {
    cout << "Dane osobowe\n";
    cout << "\tImie: " << this->imie << "\n";
    cout << "\tNazwisko: " << this->nazwisko << "\n";
    cout << "\tTelefon: " << this->telefon << "\n";
};

baza::baza( const char * i, const char * n, const char * t ) {
    cout << "Wprowadzam:\n";
    strcpy( this->imie, i );
    strcpy( this->nazwisko, n );
    strcpy( this->telefon, t );
    cout << "\tImie: " << this->imie << "\n";
    cout << "\tNaz.: " << this->nazwisko << "\n";
    cout << "\tTel.: " << this->telefon << "\n";
};
baza::~baza() {
    cout << "Usuwam:\n";
    cout << "\tImie: " << this->imie << "\n";
    cout << "\tNaz.: " << this->nazwisko << "\n";
    cout << "\tTel.: " << this->telefon << "\n";
};

klasa.h

#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
class baza {
private:
    char imie[ 10 ];
    char nazwisko[ 25 ];
    char telefon[ 10 ];
public:
    void wyswietl( const char * i, const char * n, const char * t );
    baza( const char * i, const char * n, const char * t );
    ~baza();
};
[ \c pp ]
P-174617
Jacob99
» 2019-05-14 23:24:54
Masz wyraźnie wskazane, że próbujesz dostać się do funkcji składowej wyświetl za pomocą notacji '.' zamiast '->'. Spróbuj zmienić
osoby[ i ].wyswietl()
 na
osoby[ i ]->wyswietl()
P-174618
nanoant20
» 2019-05-14 23:46:53
w klasa.cpp
void baza::wyswietl( const char * i, const char * n, const char * t )

to samo w klasa.h
void wyswietl( const char * i, const char * n, const char * t );

za dużo argumentów
wystarczy
C/C++
void baza::wyswietl()

public
: void wyswietl();
C/C++
case '3':

for( int i = 0; i < 3; i++ )
     osoby = new baza *[ 3 ]; //<- USUŃ TO

osoby[ i ].wyswietl(); // to zamiń na -> tak jak pisze @Jacob99

break;
P-174620
ayya
Temat założony przez niniejszego użytkownika
» 2019-05-15 00:22:45
Po zamianie "." na "->" ruszyło, argumenty już sam powywalałem. Pozostało teraz dodać, żeby po usunięciu danych, nie wyświetlały się śmieci, tylko komunikat o braku.
P-174621
nanoant20
» 2019-05-15 09:40:19
Pozostało teraz dodać, żeby po usunięciu danych, nie wyświetlały się śmieci, tylko komunikat o braku.

najprościej, taki prymitywny sposób bez wiekszego przerabiania kodu
C/C++
public:
void wyczysc()
{
    // wypelnienie poszczegolnych pol samymi kropkami lub spacja
    memset( imie, ' ', sizeof( imie ) );
    memset( nazwisko, ' ', sizeof( nazwisko ) );
    memset( telefon, ' ', sizeof( telefon ) );
    imie[ 0 ] = 0;
    nazwisko[ 0 ] = 0;
    telefon[ 0 ] = 0;
}

//w switch
case '1':
osoby = new baza *[ 3 ];
osoby[ 0 ] = new baza( "Adam", "Nowak1", "10" );
osoby[ 1 ] = new baza( "Piotr", "Kefas", "1" );
osoby[ 2 ] = new baza( "Filip", "z Betsaidy", "8" );
break;

case '2':
for( int i = 0; i < 3; i++ )
{
    osoby[ i ]->wyczysc();
    delete osoby[ i ];
}
delete[] osoby;
break;

dla komunikatu coś może takiego;
C/C++
void wyswietl()
{
    if(( imie != NULL ) &&( imie[ 0 ] == '\0' ) )
    {
        cout << "brak danych" << endl;
    } else {
        cout << "Dane osobowe\n";
        cout << "\tImie: " << this->imie << "\n";
        cout << "\tNazwisko: " << this->nazwisko << "\n";
        cout << "\tTelefon: " << this->telefon << "\n";
    }
}

pomimo tych sztuczek, uważam, że kod należałoby przebudować
P-174622
« 1 »
  Strona 1 z 1