Newsgroup: it.comp.lang.c++
Titolo: Dove è l'errore?

> Prezzo;
assert(!f.fail());
}
}
//scrive i dati dei contatori su file
void Persistenza::ScriviFileDati (char* filename,Pompa& p,Serbatoio& s)
{
ofstream f;
f.open(filename);
if (f.fail()) {
cout << "non posso creare il file\n";
exit (EXIT_FAILURE);
}
f << SerbQtMax << "\n"
<< s.LeggiCarico() << "\n"
<< s.LeggiScarico() << "\n"
<< p.LeggiContScarico() << "\n"
<< Prezzo;
assert(!f.fail());
}
//------------ gpl.cpp END  -----------------

 cout << "Attenzione: Carico troppo grande per il serbatoio!\n"
e altre linee del genere. Non trovo pero' la definizione (e neppure la
dichiarazione) dell'operatore che ti da problemi. Quindi o non l'hai postata o
ha ragione il compilatore.
Noto anche che hai usato la forma "cout << " invece che "std::cout <<" pertanto
mi aspetto una "using namespace std;" che pero' non trovo (ricerca della stringa
"std").
Pertanto:
1) Non leggere Schildt che nuoce gravemente alla salute
2) se posti codice, postalo in maniera che sia leggibile
3) metti a posto l'uso dei namespace
4) verifica che l'operatore effettivamente sia dichiarato e definito
5) posta, nel caso, la dichiarazione e la definizione dell'operatore
--
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556

ma si fatica a leggerlo.
Ricordo una volta in universita' di aver sentito due tizi
che parlavano del corso di programmazione (a quei tempi
nella facolta' di Matematica a Pavia si usava il Pascal) ...
  "Hai finito il programma dei cavalli ?"
  "Si e funziona. Ora devo solo indentarlo
   altrimenti il prof si incacchia."
(non sto scherzando)
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

 Pompa(PompS,Prezzo),
Mah, scherzi a parte ;-) il codice non e' un buon esempio di C++ per vari
motivi, quello piu' valido e' probabilmente lo stile e l'indentatura. Sicuro
che tu non abbia da postarci una versione piu' leggibile ?!?
Alex

 Mi RIFIUTO di controllare codice con una identazione come questa!
L'indentazione č corretta vi assicuro, e solo che il cut&paste ha
trasformato in carattere a spaziatura proporzionale e mandato a puttana
tutta l'indentazione, Inoltre ha aggiunto una strana interlinea che prima
non c'era.
Se vi da fastidio leggerlo cosě posso mandare i file .zip  con il codice;
AZ

 5) posta, nel caso, la dichiarazione e la definizione dell'operatore
Ecco il codice dell'operatore che manca. La critica è servita a mettere a
posto il formato di invio delle news in carattere a spaziatura fissa;
Ai namespace in effetti non avevo pensato, perchè il bc3.1 non li supportava
e l'errore non mi
sembrava collegato. L'errore sul tipo di ritorno del costruttore c'è tutto!
che devo dire, è un
retaggio del C :-), mea culpa!
//----------------- MYSTR.H ---------------------
#include <iostream.h>
#include <new.h>
#include <string.h>
#include <stdlib.h>
class StrType {
  char *p;
  int size;
public:
  StrType();
  StrType(char *str);
  StrType(const StrType &o); // copy constructor
  ~StrType() { delete [] p; }
  friend ostream &operator<<(ostream &stream, StrType &o);
  friend istream &operator>>(istream &stream, StrType &o);
  StrType operator=(StrType &o); // assign a StrType object
  StrType operator=(char *s); // assign a quoted string
  StrType operator+(StrType &o); // concatenate a StrType object
  StrType operator+(char *s); // concatenate a quoted string
  friend StrType operator+(char *s, StrType &o); /*  concatenate
     a quoted string with a StrType object */
};
typedef StrType String; //  StrType alias
//--------------------- MYSTR.H END-------------------------
//----------------- MYSTR.CPP ---------------------
#include "mystr.h"
StrType::StrType() {
  size = 1; // make room for null terminator
  if (!(p = new char[size])){
 cout << "Allocation error\n";
 exit(1);
  }
  strcpy(p, "");
}
// Initialize using a quoted string.
StrType::StrType(char *str) {
  size = strlen(str) + 1; // make room for null terminator
  if (!(p = new char[size])){
 cout << "Allocation error\n";
 exit(1);
  }
  strcpy(p, str);
}
// Initialize using a StrType object.
StrType::StrType(const StrType &o) {
  size = o.size;
  if (!(p = new char[size])){
 cout << "Allocation error\n";
 exit(1);
  }
  strcpy(p, o.p);
}
// Output a string.
ostream &operator<<(ostream &stream, StrType &o)
{
  stream << o.p;
  return stream;
}
// Input a string.
istream &operator>>(istream &stream, StrType &o)
{
  char t[255]; // arbitrary size - change if necessary
  int len;
  stream.getline(t, 255);
  len = strlen(t) + 1;
  if(len > o.size) {
    delete [] o.p;
 if (!(o.p = new char[len])){
 cout << "Allocation error\n";
 exit(1);
    }
 o.size = len;
  }
  strcpy(o.p, t);
  return stream;
}
// Assign a StrType object to a StrType object.
StrType StrType::operator=(StrType &o)
{
  StrType temp(o.p);
  if(o.size > size) {
    delete [] p; // free old memory
 if (!(p = new char[o.size])){
 cout << "Allocation error\n";
 exit(1);
 }
    size = o.size;
  }
  strcpy(p, o.p);
  strcpy(temp.p, o.p);
  return temp;
}
// Assign a quoted string to a StrType object.
StrType StrType::operator=(char *s)
{
  int len = strlen(s) + 1;
  if(size < len) {
 delete [] p;
 if (!(p = new char[len])){
 cout << "Allocation error\n";
 exit(1);
 }
    size = len;
  }
  strcpy(p, s);
  return *this;
}
// Concatenate two StrType objects.
StrType StrType::operator+(StrType &o)
{
  int len;
  StrType temp;
  delete [] temp.p;
  len = strlen(o.p) + strlen(p) + 1;
  temp.size = len;
  if (!(temp.p = new char[len])){
 cout << "Allocation error\n";
 exit(1);
  }
  strcpy(temp.p, p);
  strcat(temp.p, o.p);
  return temp;
}
// Concatenate a StrType object and a quoted string.
StrType StrType::operator+(char *s)
{
  int len;
  StrType temp;
  delete [] temp.p;
  len = strlen(s) + strlen(p) + 1;
  temp.size = len;
  if (!(temp.p = new char[len])){
 cout << "Allocation error\n";
 exit(1);
  }
  strcpy(temp.p, p);
  strcat(temp.p, s);
  return temp;
}
// Concatenate a quoted string and a StrType object.
StrType operator+(char *s, StrType &o)
{
  int len;
  StrType temp;
  delete [] temp.p;
  len = strlen(s) + strlen(o.p) + 1;
  temp.size = len;
  if (!(temp.p = new char[len])){
 cout << "Allocation error\n";
 exit(1);
  }
  strcpy(temp.p, s);
  strcat(temp.p, o.p);
  return temp;
}

file che non riesco a risolvere.
Facendo queste modifiche dovresti riuscire a compilare il tuo
programma:
1) In gpl.h cambia 
	#include "mystr.h"
con
	#include <string>
2) Fai un replace di "String" con "string", in gpl.h e gpl.cpp
3) togli il "void" dal costruttore della classe Persistenza
4) ridefinisci il metodo 
	void ScriviFileDati( char*, Pompa& , Serbatoio& )
come
	void ScriviFileDati( char*, Pompa , Serbatoio )
oppure 
lascia il metodo cosi` com'e`, ma in gpl.cpp sostituisci:
	ScriviFileDati("GPL.DAT",
		Pompa(PompS,Prezzo),
		Serbatoio(SerbQtMax,SerbC,SerbS));
con
	Pompa p1(PompS,Prezzo);
	Serbatoio s1(SerbQtMax,SerbC,SerbS);
	ScriviFileDati("GPL.DAT",p1,s1);
ps: approfitto per ricordare che Outlook toglie l'indentatura, ma
Emacs la rimette... :-)
-- 
Ciao, Marvin

 ha scritto:

Niente file binari sui newsgroup prego, al limite rimanda il codice dopo
esserti assicurato che il tuo newsreader non abbia fatto casino con gli
spazi(ma mi pare molto strano che succeda).
Il Ghenio
-----
ZIO : Fun and games are over with. Anyone who dares
get in my way shall perish.
DIO ci salvi dagli ocx del Viral Basic.
-----

 spazi(ma mi pare molto strano che succeda).
Perchč tu con i caratteri proporzionali riesci a mantenere l'indentazione?
ma sei un ghenio!
AZ

 Se vi da fastidio leggerlo così posso mandare i file .zip  con il codice;
Il fatto che tu abbia il NR impostato con un carattere proporzionale e' un
problema tuo. In un testo ASCI non esistono specifiche di font. La stragrande
maggioranza dei professionisti usa un NR impostato con carattere proporzionale.
Il discorso del cut&paste e' dovuto al fatto che probabilmente usi Outlook e VC.
Outlook, anche se impostato per un carattere proporzionale, quando gli fai il
paste di roba che non e' puramente testuale passa in modalità "HTML". E dato che
in HTML non puo' rendere il font e le dimensioni usate da VC cerca di
reinterpretare la cosa a modo suo e fa casino.
I miei consigli:
1) imposta il NR con un carattere proporzionale
2) passa sempre da notepad se fai cut&paste (cut in VC, paste in notepad,
controllo che tutto vada bene, cut da notepad, paste in Outlook, controllo che
tutto vada bene)
3) se ti accorgi che qualche cosa non va nel messaggio prima di postarlo, o
trovi il modo di correggere il problema o non lo posti


 ma sei un ghenio!
Guarda che e' possibilissimo avere l'indentazione anche con i caratteri
proporzionali. Il problema e' semmai l'incolonnamento dei commenti a destra del
codice.


 #include <iostream.h>
Ricordo male o l'altro file includeva iostrem mentre questo include iostream.h ?
Ripeto: metti a posto i namespace.
Dimentica i file con estensione .h che non fanno parte del C++ e metti a posto i
namespace.
Vedrai che poi tutto va a posto.
Pero' metti a posto i namespace.
