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? |
|
carlosmay |
» 2017-03-19 01:27:44 Pokaż problematyczny fragment. Może pogubiłeś virtual w metodach. |
|
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: #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: #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 ); };
|
|
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. |
|
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
|
|
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 #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'; } |
|
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? |
|
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ć. |
|
« 1 » 2 |