Konstruktor klasy generuje błąd kompilacji – co mam źle?

0

witam, piszę kod w c++ builder i pisząc konstruktora do danej klasy otrzymuję błędy

[C++ Error] Unit1.cpp(38): E2108 Improper use of typedef 'string'
[C++ Error] Unit1.cpp(38): E2293 ) expected

nie mogę sobie poradzić z odszyfrowaniem tego więc byłbym bardzo szczęśliwy, gdyby ktoś spojrzał na to i może powiedział co mam źle

plik.cpp

//---------------------------------------------------------------------------
#include <tchar.h>
#include <vcl.h>
#pragma hdrstop
#include <iostream>
#include <string>
#include <fstream>
#include "Unit1.h"
#include <cstdlib>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1* Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
string linia;
string a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, r, s, t, u;

using namespace std;
fstream miejsce_lok;
void uzytkownicy::wczytaj()
{
    miejsce_lok.open("wskaznik.txt", ios::in);
    if (miejsce_lok.good() == false)
        ;
    {
        MessageBox(NULL, "plik wskaznik istnieje, nie możliwe jest uruchomienie dalej systemu",
            "wiadomosc", MB_ICONINFORMATION | MB_OK);
        terminate();
    }
    string miejsce;
    getline(miejsce_lok, miejsce);
    miejsce_lok.close();

    uzytkownicy::uzytkownicy(string im, string naz, string has, string adm)
    {
        imie = im;
        nazwisko = naz;
        haslo = has;
        adm = admin;
    }

plik.h

//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <iostream>
using namespace std;
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
    __published : // IDE-managed Components
                  private : // User declarations
                            public : // User declarations
                                     __fastcall TForm1(TComponent* Owner);
};
class uzytkownicy
{

    string imie, nazwisko, haslo, admin;
    uzytkownicy(string = "brak", string = "brak", string = "1111", string = "tak");

public:
    void wczytaj();
    void pokaz();
    ~uzytkownicy();
};

//---------------------------------------------------------------------------
extern PACKAGE TForm1* Form1;
//---------------------------------------------------------------------------
#endif
1
  string linia;
    string a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,r,s,t,u;

using namespace std;

zła kolejność. Nazwy zmiennych, zmienne globalne i polskie nazwy też dziwne.

0

dzięki wielkie, szukałem czegoś znacznie bardziej skomplikowanego a błąd w czymś takim tkwił.
Jeszcze raz dzięki !

3

JEŚLI chcesz się na borlandach uczyć programowania obiektowego, a nie jakiegoś kalekiego klikania, ZARAZ skasuj w dwóch miejscach zmienną globalną (wyskoczą ci błędy - będziesz musiał powoływać normalnie jak w C++)

TForm1* Form1;

Tu już jesteś zarażony zmiennymi globalnymi:

/---------------------------------------------------------------------------
string linia;
string a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, r, s, t, u;
 
0

Chciałem ponowić pytanie ponieważ po zmianie tego co sugerowaliście cały czas dostaję błąd z konstruktorem :/
próbowałem bez używania namespace, z biblioteką std, jednak cały czas pojawia mi się ten sam błąd. Zmieniłem również położenie zmiennych globalnych które znajdują się teraz w klasie pod deklaracją public.

c++ uczę się od niedawna, i nie potrafię wyśledzić błędu , a to chyba jest najgorsze. Próbuje zrobić kod który potrafi rozpoznać i zalogować 20 osób. błędy jakie mi się wyświetlają :

[C++ Error] Unit1.cpp(39): E2108 Improper use of typedef 'string'
[C++ Error] Unit1.cpp(39): E2293 ) expected
[C++ Warning] Unit1.cpp(122): W8066 Unreachable code

gra toczy się o tą linię kodu

uzytkownicy::uzytkownicy(string im,string naz, string has,string adm)

Unit1.h

//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include<iostream>
using namespace std;
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
private:    // User declarations
public:     // User declarations
        __fastcall TForm1(TComponent* Owner);
};
class uzytkownicy
{

string imie,nazwisko,haslo,admin;
uzytkownicy(string="brak" , string="brak" ,string="1111" ,string="tak" );
public:
  string linia;
    string a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,r,s,t,u;
     string im,naz,has,adm;
void wczytaj();
void pokaz();
~uzytkownicy();
};

//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

Unit1.cpp

 //---------------------------------------------------------------------------

include <tchar.h>
#include <vcl.h>
#pragma hdrstop
#include<iostream>

#include<fstream>
#include "Unit1.h"
#include <cstdlib>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 using namespace std;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{

}
//---------------------------------------------------------------------------

fstream miejsce_lok;
void uzytkownicy::wczytaj()
{
 using namespace std;
    miejsce_lok.open("wskaznik.txt",ios::in);
    if(miejsce_lok.good()==false);
    {
        MessageBox(NULL,"plik wskaznik istnieje, nie możliwe jest uruchomienie dalej systemu","wiadomosc",MB_ICONINFORMATION | MB_OK);
        terminate();
    }
    string miejsce;
    getline(miejsce_lok,miejsce);
    miejsce_lok.close();

    uzytkownicy::uzytkownicy(string im,string naz, string has,string adm)
    {
        imie=im;
        nazwisko=naz;
        haslo=has;
        adm=admin;
    }

    string dane_listy_uzyt=miejsce;
    fstream uzyt;
    uzyt.open("dane_listy_uzyt",ios::in);
    if(uzyt.good()==false)
    {
        cout<<"Nie udalo sie otworzyc pliku uzyt!";
        terminate();
    }

      int nr_linii=1;
    while (getline(uzyt,linia))
    {
        switch (nr_linii)
        {
        case 1:
            linia=a;
            break;
        case 2:
            linia=b;
            break;
        case 3:
            linia=c;
            break;
        case 4:
            linia=d;
            break;
        case 5:
            linia=e;
            break;
        case 6:
            linia=f;
            break;
        case 7:
            linia=g;
            break;
        case 8:
            linia=h;
            break;
        case 9:
            linia=i;
            break;
        case 10:
            linia=j;
            break;
        case 11:
            linia=k;
            break;
        case 12:
            linia=l;
            break;
        case 13:
            linia=m;
            break;
        case 14:
            linia=n;
            break;
        case 15:
            linia=o;
            break;
        case 16:
            linia=p;
            break;
        case 17:
            linia=r;
            break;
        case 18:
            linia=s;
            break;
        case 19:
            linia=t;
            break;
        case 20:
            linia=u;
            break;
   **  nr_linii++; **
        }

     }
    }
1

@kuba1334 dlaczego ciało konstruktora umieszczasz w jakiejś innej metodzie?

Zrób tak:

uzytkownicy::uzytkownicy(string im,string naz, string has,string adm)
{
    imie=im;
    nazwisko=naz;
    haslo=has;
    adm=admin;
}
void uzytkownicy::wczytaj()
{
 using namespace std;
    miejsce_lok.open("wskaznik.txt",ios::in);
    if(miejsce_lok.good()==false);
    {
        MessageBox(NULL,"plik wskaznik istnieje, nie możliwe jest uruchomienie dalej systemu","wiadomosc",MB_ICONINFORMATION | MB_OK);
        terminate();
    }
    string miejsce;
    getline(miejsce_lok,miejsce);
    miejsce_lok.close();



    string dane_listy_uzyt=miejsce;
    fstream uzyt;
    uzyt.open("dane_listy_uzyt",ios::in);
    if(uzyt.good()==false)
    {
        cout<<"Nie udalo sie otworzyc pliku uzyt!";
        terminate();
    }

      int nr_linii=1;
    while (getline(uzyt,linia))
    {
        switch (nr_linii)
        {
        case 1:
            linia=a;
            break;
        case 2:
            linia=b;
            break;
        case 3:
            linia=c;
            break;
        case 4:
            linia=d;
            break;
        case 5:
            linia=e;
            break;
        case 6:
            linia=f;
            break;
        case 7:
            linia=g;
            break;
        case 8:
            linia=h;
            break;
        case 9:
            linia=i;
            break;
        case 10:
            linia=j;
            break;
        case 11:
            linia=k;
            break;
        case 12:
            linia=l;
            break;
        case 13:
            linia=m;
            break;
        case 14:
            linia=n;
            break;
        case 15:
            linia=o;
            break;
        case 16:
            linia=p;
            break;
        case 17:
            linia=r;
            break;
        case 18:
            linia=s;
            break;
        case 19:
            linia=t;
            break;
        case 20:
            linia=u;
            break;
        }

     }
    }

U mnie po takiej zmianie zadziałało na Builderze. Co więcej dlaczego w plikach *.c oraz *.cpp z formatką umieszczasz kod innych klas? Utwórz sobie nowy unit i tam zawrzyj klasę uzytkownicy co więcej nie używaj w nagłówkach use namespace oraz zmiennych globalnych.

2

Kolega @kuba1334 gdyby otworzył kilka kartek ksiązki do C++, w ciągu 5 minut by zauważył

  1. jak się inicjuje konstruktor, a nie czekał trzy dni.
  2. zauważyłby koło 10 strony takie dziwne coś z prostokątnymi klamerkami [ ] ... to tablica, i by nie powoływał 26 zmiennych ani switcha. To jest zrozumiałe dla klikaczy Embecadero, ponieważ IDE nigdy nie generuje tablicy, więc tablice nie istnieją (na zasadzie: jak cię nie ma w FB, to nie żyjesz)
  3. pewnie by się dało w głupiej papierowej książce koło 5 strony tekstu zauważyć, że podstawia się z prawej strony na lewą, z lewej na prawą "to działa trochę gorzej".

Oczywiście prawdziwi builderowcy nie czytają niczego, tylko klikają.

Nie czas widzę, aby uczyć programowania obiektowego, które pola (nie zmienne) w klasie mają sens - które ZMIENNE mają sens w funkcji, dlaczego zmienne globalne są be itd...

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