Własna klasa, trzymanie obiektu fstream

0

Witam, jestem początkujący w C++ i nie wiem dokładnie jak tego dokonać. Chciałbym po prostu zrobić coś takiego:

 bool Files::open(const char* name) {

    if (this->fileExists(name)) {
fstream file(name);
// this.file = file; 
}
}

Konkretnie to co jest zakomentowane. W pliku files.h mam:

    private:
        fstream file;

Jednakże kompilator twierdzi: `file' is not a type
I tutaj potrzebuję Waszej pomocy, jak ten obiekt przypisać do zmiennej, którą zamierzam trzymać w klasie. (potrzebny do metod: string read(), bool write(const char* text) )

Programuję w PHP od kilku lat i nie jestem przyzwyczajony, że trzeba pilnować typów zmiennych, obiektowość też tam inaczej wygląda. (kto ugryzł php będzie wiedział o co mi chodzi) ;/

BTW chciałbym dowiedzieć się czym tak naprawdę różnią się zapisy:


klasa obiekt;
klasa* obiekt;
klasa* obiekt = new klasa;
// innych nie znalazłem na necie xd
0

zamiast tworzyć lokalną zmienną typu fstream w tej Twojej funkcji, lepiej chyba od razu użyć zmiennej file.
czyli:

file.open(name, fstream::in)

co do drugiego pytania:

klasa obiekt;

tworzy nowy obiekt typu klassa

klasa* obiekt;

tworzy wskaźnik do obiektu typu klasa

klasa* obiekt= new klasa;

tworzy wkaźnik do obiektu typu klasa i jednocześnie tworzy za pomocą operatora new sam obiekt (rezerwuje pamięć, wywołuje konstruktor.... poczytaj trochę o dynamicznym tworzeniu zmiennych, operatory new i delete ;-)

0
carlic napisał(a)

zamiast tworzyć lokalną zmienną typu fstream w tej Twojej funkcji, lepiej chyba od razu użyć zmiennej file.
czyli:

file.open(name, fstream::in)

Wybacz, lecz nie rozumiem. ^ Albo Ty źle zrozumiałeś mojego poprzedniego posta.
Zacznijmy więc od początku, chcę napisać sobie klasę Files do obsługi plików (w ramach nauki)

Plik files.h przedstawia się następująco:

#ifndef files_h
#define files_h

using namespace std;

class Files {
    
    public:
        bool open(const char* name);
        bool close();
        
        bool fileExists(const char* name);

        string read();
        bool write(const char* text);

    private:
        string lines[1000];
        fstream* file;
        
};

#endif

Natomiast plik files.cpp

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string>
#include "files.h"

using namespace std;

bool Files::open(const char* name) {

    if (this->fileExists(name)) {
        fstream file(name);
        this.file = file;
    }else{
        cout << "Error, file is no exists" << endl;
    }

}

bool Files::fileExists(const char* name) {
    fstream file(name, ios::in);

    if (file.good()) {
        file.close();
        return true;
    }
    
    file.close();
    return false;

}
/*
string Files::read() {

}

bool Files::write(const char* text) {

}
*/

Teraz tak, otwieram plik:

fstream plik("nazwa");

I plik jest obiektem fstream, tak?
Jeżeli jest obiektem to chcę go zapisać w zmiennej, którą definiuję jako prywatną o nazwie file.
Następnie metody: read, write, close będą pracowały z tym obiektem.

Mógłbym po prostu zapamiętać nazwę pliku i go za każdym razem otwierać etc. - ale nie po to piszę klasę, aby robić coś nieprofesjonalnie. (chcę raz otworzyć plik i pracować tak długo, aż nie wywołam destruktora klasy [który nie jest jeszcze napisany xd])

0

this.file = &file;

Składnik Twojej klasy to wskaźnik. Wskaźnik możesz przypisać do wskaźnika bez żadnych dodatkowych operatorów, ale kiedy przypisujesz obiekt to musisz użyć &, który zwraca adres tego obiektu w pamięci.
Wskaźniki pokazują na jakiś adres w pamięci, nic więcej.

0

fstream* file;

Usuń wskaźnik (*)

0
tobix10 napisał(a)

this.file = &file;

Składnik Twojej klasy to wskaźnik. Wskaźnik możesz przypisać do wskaźnika bez żadnych dodatkowych operatorów, ale kiedy przypisujesz obiekt to musisz użyć &, który zwraca adres tego obiektu w pamięci.
Wskaźniki pokazują na jakiś adres w pamięci, nic więcej.

-=mAkAbrAs=- napisał(a)

fstream* file;

Usuń wskaźnik (*)

Ani jedno ani drugie nie działa. Dalej ten sam błąd: `file' is not a type

Nawet razem nie działają.

0

To zacznijmy od tego czy masz.

#include <fstream>
using namespace std;

0
tobix10 napisał(a)

To zacznijmy od tego czy masz.

#include <fstream>
using namespace std;

Tam gdzie dałem kod obu plików:

#include <fstream>
#include <string>
#include "files.h"

using namespace std;
0
carlic napisał(a)

zamiast tworzyć lokalną zmienną typu fstream w tej Twojej funkcji, lepiej chyba od razu użyć zmiennej file.
czyli:

file.open(name, fstream::in)

I udało się mi pojąć!
Zadeklarowałem: fstream file;

Czyli potem odwołuje się:
this->file.open(name);

A ja próbowałem:
this.file.open(name);

BTW nie wiem czym się różni -> od wyłuskania w php jest jedno (nie licząc statycznych)

0

Na chłopski rozum: Kropka jest od klas, struktur, a -> od wskaźników.

0
pcmcymc napisał(a)

Na chłopski rozum: Kropka jest od klas, struktur, a -> od wskaźników.

Jak dla kogo ;p

W php masz tylko dwie możliwości:

class przyklad {

static public $zmienna;
public $zmienna2;

}

przyklad::$zmienna = 'wartosc';
$obj = new przyklad;
$obj->zmienna2 = 'wartosc';

A dostęp wewnątrz:


class przyklad {

static public $zmienna;
public $zmienna2;

public function test(){
self::$zmienna = 'wartosc';
$this->zmienna2 = 'wartosc';
}

}

Po prostu muszę troszkę się douczyć jeżeli chodzi o programowanie obiektowe w C++

0

w C/C++ operator ::, . i operator -> to sa trzy kompletnie rozne operatory, acz wszystkie sluza do wyciagania czegos-z-czegos

operatora A::B uzywasz do 'ręcznego' okreslania przynaleznosci (typA-zawiera-costamB) w momencie gdy kompilator z jakiegos powodu sam sie jej nie moze domyslic

operatora A.B uzywasz do okreslania, ze chcesz bezposrednio wyciagnac z obiektu A jakas rzecz o nazwie B, czyli np. zeby ze struktury/klasy wyciagnac pole, albo zeby ze struktury/klasy 'wyciagnac' metode i ja wywolac operatorem (args,..) itp

operatora A->B uzywasz do okreslania, ze chcesz posrednio wyciagnac z obiektu A jakas rzecz o nazwie B, to znaczy ze spodziewasz sie, ze obiekt A wcale jej nie posiada, ale ze ma on jakas "mozliwosc domyslania się" gdzie faktycznie siedzi B, i ma mozliwosc "ściagniecia" jej stamtad i oddania Tobie.

jesli spojrzysz na nie w taki sposob, nie powinienes miec pozniej problemu z pojeciem, czym sie rozni zapis czemu mozna dla swojej klasy definiowac wlasny operator-> i sprawiac zeby robil cos co Ci sie podoba, ale . i :: sa nieredefiniowalne, 'wyryte w języku', ze sztywnym znaczeniem:)

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