| 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 identyfikatorC3646	"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 |