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

[C++] Zdeklarowany plik typu fstream jako protected, otwieranie w konstruktorze, blad przy przekazywaniu do szablonu i konstruktora kopiującego.

Ostatnio zmodyfikowano 2017-02-15 14:01
Autor Wiadomość
probs
Temat założony przez niniejszego użytkownika
[C++] Zdeklarowany plik typu fstream jako protected, otwieranie w konstruktorze, blad przy przekazywaniu do szablonu i konstruktora kopiującego.
» 2017-02-15 01:19:23
Pisząc projekt na zaliczenie laboratorium zetknąłem się z pewny problemem. W klasie zadeklarowałem dwie zmienne plikowe:

C/C++
class klasa
{
protected:
    fstream plik1;
    fstream plik2;
    ...

W konstruktorze otwieram pliki:

C/C++
plik1.open( "pierwiastki.txt" );

A w destruktorze rzecz jasna zamykam. Do tej pory problemu nie ma, wczytuję dane jak należy. Problem pojawia się przy konstruktorze kopiującym, gdzie oprócz nowej dynamicznej alokacji i przypisania zmiennych zawieram takie coś:

C/C++
plik1 = kopia.plik1; // i analogicznie do dugiego
Próbowałem z samym otwieraniem i też nic. W obu przypadkach dostaję komunikaty (jak trzeba wkleić całego loga, ie ma sprawy):

"789 5 C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include\c++\bits\ios_base.h [Error] 'std::ios_base& std::ios_base::operator=(const std::ios_base&)' is private"

Podobnie rzecz ma się przy przekazywaniu obiektów do szablonu klasy:

C/C++
template < class I, class II > class szablon
{
    I a;
    II b;
    int p1, p2;
    string nazwa1, nazwa2;
   
public:
    szablon( I & aa, II & bb )
    {
        a = aa;
        b = bb;
    }

Dodam, że po usunięciu plików fstream szablon działał bez zarzutu. Czy koledzy i koleżanki starsi stażem mogliby mi podpowiedzieć, gdzie popełniam błąd w rozumowaniu?



P-157726
carlosmay
» 2017-02-15 01:30:20
Trzymaj w klasie referencje do strumieni. Strumienie C++ mają usunięte lub prywatne konstruktory kopiujące,
więc siłą rzeczy nie możesz użyć ich w swoim konstruktorze, bo nie można ich kopiować.
P-157727
probs
Temat założony przez niniejszego użytkownika
» 2017-02-15 10:08:07
Dziękuję za odpowiedź. Chciałem jeszcze dopytać o ogólny schemat. Pogrzebałem też na innych forach i diagnoza jest taka, że refencje do obiektów fstream mogą być zdeklarowane w prywatnych składnikach klasy. Tylko pogubiłem się jak otworzyć plik za ich pomocą, zarówno w konstruktorze klasy jak i tym kopiującym. Temat strumieni jest widzę bardzo rozbudowany i jeszcze muszę nad nimi posiedzieć, ale czy w przypadku konstruktora kopiującego należy zmienić jego nagłówek, dopisując oprócz obiektu przekazywanego przez referencję jako kolejne argumenty fstream& przekazywanych przez referencję?
P-157729
michal11
» 2017-02-15 12:46:03
Moim zdaniem to słaby pomysł. Nie bez powodu strumienie mają prywatne konstruktory kopiujące. Po co ci strumień w twojej klasie i dlaczego chcesz go kopiować? Dodaj więcej szczegółów co chcesz osiągnąć.
P-157739
probs
Temat założony przez niniejszego użytkownika
» 2017-02-15 13:05:01
Tworzę program, który tworzy przechowuje informacje nt pierwiastków chemicznych. Wczytuje dane z pliku do inicjalizacji jednego z przeciążonych konstruktorów Pierw(int n) który na podstawie tylko podanej liczby i w pętli wczytujący konwertowane dane przypisuje je zmiennym chronionym. Konstruktor kopiujący był wymagany w projekcie i jest potrzebny w szablonie, który buduje związek chemiczny na podstawie pierwiastków. I tu program się sypie wyrzucając komunikat podany wyżej o prywatnym operatorze przypisania dla strumieni. Program ma za zadanie wczytywać dane do tablicy obiektów, więc bez konstruktora kopiującego się też nie obejdzie.

C/C++
class Pierw
{
protected:
    ifstream plik1( "pierwiastki.txt" );
    ifstream plik2( "utl.txt" );
   
    //tu pozostałe zmienne, ale są nieistotne
   
   
public:
    Pierw()
    {
        //przypisanie wszystki floatom doubleom intom wartosci domyslnych
        plik1.open( "pierwiastki.txt", ios::in );
        plik2.open( "stutl.txt", ios::in );
       
    }
    //zostawiłem dane do konstr sparametryzowanego jakie byly
    Pierw( int group, int A, int nOx, int isot, int oxid, string name, double M, double eminus, float boil, float solid, float Esolid, float Eboil, float mcapacity, float capacity, string S, string Lt, int year, double density )
    plik1.open( "pierwiastki.txt" );
    plik2.open( "stutl.txt" );
    //przypisanie double intow floatow
}

Pierw( int n )
{
    string help;
    int count = 1;
    plik1.open( "pierwiastki.txt", ios::in );
    plik2.open( "stutl.txt", ios::in );
    while( getline( plik1, help ) )
    {
        //blablabla przypisanie zmiennych
        count++;
    }
    /*count=1;
                int tmp=0;
                while(getline(plikutl,help))
                {
                    if(count==n) plikutl>>stut[tmp++];
                    count++;
                }*/
}

~Pierw()
{
    stut = NULL;
    plik1.close();
    plik2.close();
}

Pierw( const Pierw & kopia )
{
    //plik1=kopia.plik1;
    //plik2=kopia.plik2;
   
}
//metody
//przeciazone operatory
};

template < class I, class II > class zwiazek2
{
I a;
II b;
int p1, p2;
string nazwa1, nazwa2;

public:
zwiazek2( I & aa, II & bb )
    : a( aa )
     , b( bb )
{ }
void podaj_H();
//metody
};


EDIT

Doszedłem do wniosku, żeby pliki typu fstream dać globalnie oraz wywołując je w konstruktorach obarczyć warunkiem, żeby nie otwierać pliku, jeżeli jest otwarty przez inny obiekt danej klasy. fstream plik jest obiektem, więc bezpiecznie jest go przekazywać przez referencję. Tylko pytanie jak teraz do tego podejść?
P-157740
michal11
» 2017-02-15 14:01:02
Napisz jeszcze co chcesz otrzymać poprzez skopiowanie strumieni, jaki efekt? Masz jakiś strumień na plik w jednym obiekcie, powiedzmy, że odczytywałeś z niego jakieś danie, jak sobie wyobrażasz że ten strumień byłby skopiowany? Jak miałby się zachowywać w obiekcie drugiej klasy? Może wystarczy po prostu otworzyć nowy strumień dla drugiego obiektu, albo w ogóle wywalić to do maina i przekazywać do klasy tylko dane ew. strumień przez referencje do jakiejś metody?
P-157745
« 1 »
  Strona 1 z 1