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

Nieznany specyfikator przesłonięcia

Ostatnio zmodyfikowano 2017-03-19 14:30
Autor Wiadomość
Kinexity
Temat założony przez niniejszego użytkownika
Nieznany specyfikator przesłonięcia
» 2017-03-19 01:11:04
Witam wszystkich!
Rozwijam ostatnio w VS2017 swój projekt i mam pewien niezrozumiały dla mnie problem: Program tworzę w oparciu o obiektowy aspekt C++. Jego główne klasy wymagają obsługiwania plików. Chciałbym w nich umieszczać deklarację zmiennych typu fstream w plikach nagłówkowych, lecz wtedy wyskakuje mi błąd nr C3646 (nieznany specyfikator przesłonięcia). Mogę to obejść poprzez umieszczanie tej deklaracji wewnątrz metod, lecz wprowadza to bałagan w kodzie. Z czego wynika ten błąd i czy jest jakiś sposób rozwiązania go?
P-159140
carlosmay
» 2017-03-19 01:27:44
Pokaż problematyczny fragment.
Może pogubiłeś
virtual
 w metodach.
P-159141
Kinexity
Temat założony przez niniejszego użytkownika
» 2017-03-19 01:31:48
Wątpię, żeby pomogło w rozwiązaniu, ale proszę bardzo.

Jedna z funkcji:

C/C++
#include "stdafx.h"
#include "lpierwz.h"
#include "fstream"
#include "iostream"
#include "conio.h"
#include "string"
using namespace std;

void lpierwz::oiw() {
    if( tryb == 0 ) {
        return;
    }
    fnum = this->fcheck( NULL );
    if( fnum == 1 ) {
        this->fpm( false );
    }
    else {
        this->fpm( true );
    }
    for( unsigned __int64 i = 2; lsp != 0; i++ ) {
        do {
            pier = static_cast < unsigned __int64 >( pow( lsp, 0.5 ) + 1 );
            while( mod > 0 )
            {
                if( pier > dz[ dziel ] ) {
                    mod = lsp % dz[ ++dziel ];
                    continue;
                }
                break;
            }
            if( pier <= dz[ dziel ] && mod != 0 ) {
                cout << porz++ << " - " << lsp << endl;
                ps[( porz - 1 ) % 1000000 ] = lsp;
                check_if_p_flag = true;
            }
            dziel = 0;
            mod = ++lsp % dz[ dziel ];
        } while(( check_if_p_flag ?( porz % 1000000 != 1 )
            : true ) &&( lsp != 0 ) );
       
        zapis.open( "pierwsze[" + to_string( i ) + "].bin", ios::out | ios::app | ios::binary | ios::trunc );
        zapis.write(( char * ) ps, 8000000 );
        zapis.close();
        check_if_p_flag = false;
    }
}

Plik nagłówkowy:

C/C++
#include "base.h"
class lpierwz
    : public base
{
private:
    int par;
    bool check_if_p_flag;
    unsigned __int64 dziel, lsp, mod, pier, * dz, fnum, * ps;
    fstream zapis;
public:
    lpierwz();
    ~lpierwz();
    void fpm( bool f );
    void oiw();
    unsigned __int64 fcheck( unsigned __int64 fn );
};
P-159142
carlosmay
» 2017-03-19 01:35:57
Dorzuć jeszcze treść błędów.

edit:
wprowadza to bałagan w kodzie.
:0
- nazwy zmiennych nic nie mówią.
- dodane pliki standardowe nagłówkowe są w cudzysłowach (więcej wysiłku dla kompilatora).
- polskie skróty zamiast angielski nazw.

P-159143
Kinexity
Temat założony przez niniejszego użytkownika
» 2017-03-19 01:41:22
C2065 "zapis": niezadeklarowany identyfikator
C3646 "zapis": nieznany specyfikator przesłonięcia
C4430 brak specyfikatora typu - założono, że int. Uwaga: C++ nie obsługuje domyślnie typu int

Edit:
Bałagan jest nieunikniony - i tak jest lepiej niż kiedyś - mówię to po dwóch całkowitych przebudowach kodu.
- mówią ale mi - wiadomo, że mógłbym powstawiać kilometrowe tasiemce, by każdy mógł zrozumieć, tyle że ten mini projekt robię ja dla siebie
- cudzysłowy wstawiają się automatycznie, a 2s różnicy mi nie robi.
- to jest tak w ogóle wyższa szkoła jazdy - część jest skrótami od angielskich nazw, część od polskich

P-159144
carlosmay
» 2017-03-19 01:52:32
C2065 "zapis": niezadeklarowany identyfikator
Czego tutaj nie rozumiesz?
Może próbujesz kopiować
std::fstream
, czego nie da się zrobić.
Może przesłaniasz gdzieś nazwę obiektu strumienia.
Może nie dałeś gdzieś
virtual
 przy dziedziczonych metodach.
Może ... ?
Fragment, który wkleiłeś nic nie mówi i jest okropny do czytania.

Jeśli masz zamiar trzymać obiekty strumieni plikowych jako składowe klasy, trzymaj tam referencje (lub wskaźniki) do nich.
Można też przenosić (
std::move
), ale nie kopiować.

edit: taki drobny przykład
C/C++
#include <iostream>
#include <fstream>
#include <string>

class Foo {
    std::fstream & file;
    std::string str;
    std::string str2;
public:
    Foo( const std::string & s, std::fstream & file )
        : str
    { s }, file { file } { }
    void Save() const;
    void Load();
    const std::string & GetTestString() const;
};

void Foo::Save() const
{
    this->file.open( "test.bin", std::ios::binary | std::ios::out | std::ios::trunc );
    if( this->file ) {
        file.write( str.data(), str.size() + 1 );
    }
    file.close();
}

void Foo::Load()
{
    this->file.open( "test.bin", std::ios::binary | std::ios::in );
    if( this->file ) {
        std::getline( file, str2, '\0' );
    }
    file.close();
}

const std::string & Foo::GetTestString() const
{
    return { str2 };
}

int main()
{
    std::fstream file;
    Foo f { "asdf", file };
    f.Save();
    f.Load();
    std::cout << f.GetTestString() << '\n';
}
P-159145
michal11
» 2017-03-19 11:17:13
W nagłówku masz zmienna zapis którą zadeklarowałeś jako typ fstream, po 1 brakuje std, po 2 brakuje includa dla tej klasy, skąd kompilator ma wiedzieć co to jest?
P-159146
carlosmay
» 2017-03-19 11:31:29
Nie wiedomo co ma pododawane w pliku base.h.
Z tych fragmentów nie da się jednoznacznie odpowiedzieć.
P-159147
« 1 » 2
  Strona 1 z 2 Następna strona