Newsgroup: it.comp.lang.c++
Titolo: Dubbi su classe

Ciao ragazzi ho un po di cose da farvi vedere che sinceramente non capisco
vi mostro il programma di sotto con accanto i dubbi sulle cose che non mi
sono chiare;
----------------------------------------------------------------------------
--------------------------------
#ifndef PRODOTTI_H
#define PRODOTTI_H
#include <iostream.h>
#include <stdlib.h>
#include <fstream.h>
#include <string.h>
#include <stdio.h>
class Prodotti{
   protected :
     char* nome;
     float costo_unitario;
     ofstream out;
   public :
     Prodotti();                                                 //Posso
usare il costruttore così visto che mi è stato chiesto di usare il metodo
set_dati nel costruttore?;
    void stampa_etichette(char* nome, float costo_unitario);
    void set_dati(char* nome, float costo_unitari);
     ~Prodotti();
};
#endif
----------------------------------------------------------------------------
-----------------------------------
#include "prodotti.h"
//costruttore;
Prodotti::Prodotti(){
       Prodotti::set_dati(nome, costo_unitario);                    // ?Va
bene così?
}
void Prodotti::set_dati(char* nome, float costo_unitario){
//questa sembra funzionare;
    char temp[50];
    cin.ignore();
    cout << "\nNon Alimentari" << endl;
    cout << "\nNome Prodotto :";
    cin.getline(temp, 50);
    nome = new char[strlen(temp) + 1];
    strcpy(nome, temp);
    cout << "\nCosto unitario : ";
    cin >> costo_unitario;
}
void Prodotti::stampa_etichette(char* nome, float costo_unitario){
   ofstream file;
    file.open("Prodotti.txt");                          //La modalità di
apertura è rimasta così solo per provare la procedura!!!
    file << "\nNon Alimentari" << endl;        //In compilazione non da
problemi ma in esecuzione non stampa!!!
    file << "\nNome Prodotto : " << nome;
    file << "\nCosto unitario : " << costo_unitario;
    file.close();
}
//Distruttore;
Prodotti::~Prodotti(){
    delete [] nome;
}
----------------------------------------------------------------------------
----------------------------------
#ifndef ALIMENTARI_H
#define ALIMENTARI_H
#include "prodotti.h"
class Alimentari  {
     private :
     char* nome;
     float costo_unitario;
     char* data_scadenza;
     float peso;
     public :
    Alimentari();//mi è stato chiesto di usare il metodo set_dati nel
costruttore
    void stampa_etichette(const char* nome, float costo_unitario, const
char* data_scadenza, float peso);
    void set_dati(char* nome, float costo_unitario, char* data_scadenza,
float peso);
     ~Alimentari();
};
#endif
----------------------------------------------------------------------------
----------------------------------
#include "alimentari.h"
Alimentari::~Alimentari(){
    delete [] nome;
    delete [] data_scadenza;
}
void Alimentari::set_dati(char* nome, float costo_unitario, char*
data_scadenza, float peso){
   char temp1[50];
   char temp2[50];
   cout << "\nAlimentari" << endl;
   cin.ignore();
   cout << "\nNome prodotto : ";
   cin.getline(temp1, 50);
   nome = new char[strlen(temp1) + 1];
   strcpy(nome, temp1);
   cout << "\nCosto unitario : ";
   cin >> costo_unitario;
   cin.ignore();
   cout << "\nConsumare preferibilmente entro : ";
   cin.getline(temp2, 50);
   data_scadenza = new char[strlen(temp2) + 1];
   strcpy(data_scadenza, temp2);
   cout << "\nPeso : ";
   cin >> peso;
}
Alimentari::Alimentari(){
   Alimentari::set_dati(nome, costo_unitario, data_scadenza, peso);
}
void Alimentari::stampa_etichette(const char* nome, float costo_unitario,
const char* data_scadenza, float peso){
   ofstream file;
    file.open("Prodotti.txt");
     file << "\nAlimentari" << endl;
     file << "\nNome Prodotto : " << nome;
     file << "\nCosto unitario : " << costo_unitario;
     file << "\nConsumare preferibilmente entro : " << data_scadenza;
     file << "\nPeso : " << peso;
    file.close();
}
----------------------------------------------------------------------------
--------------------------------------------------------
#include "alimentari.h"
int main(){
  char* nome;                      //è corretto dichiarare queste variabili?
  char* data_scadenza;
  float costo_unitario, peso;
  Alimentari *a;
  Prodotti *p;
  int dim1, dim2;
  cout << "\nquante etichette di prodotti non alimentari vuoi stampare?" <<
endl;
  cin >> dim1;
  cout << "\nquante etichette di prodotti alimentari vuoi stampare?" <<
endl;
  cin >> dim2;
                                                       //mi è stato chiesto
di usare degli array per utilizzare gli oggetti!
 a = new Alimentari[dim2];              //perchè funziona come un ciclo io
sapevo che new allocava solo spazio in memoria, invece sembra che chiama il
costruttore!
  p = new Prodotti[dim1];
 /*for(int i = 0; i < dim2; i++)
//Lasciando commentato non da errori in esecuzione se però lascio eseguire
va in errore;
   a[i].stampa_etichette(nome, costo_unitario, data_scadenza, peso); */
  /*for(int i = 0; i < dim1; i++)
   p[i].stampa_etichette(nome, costo_unitario);*/
  system("PAUSE");
  return 0;
}
----------------------------------------------------------------------------
--------------------------------------------------------

 }
stessa considerazione sui parametri fatta per la funzione precedente.
Non capisco perche' apri un file e poi non lo usi, cmq se riscrivi la 
funzione set_dati come ti ho mostrato anche questa comincera' a funzionare
[snip]
per ora mi fermo :-), devi ricontrollare abbastanza cose...
cmq una considerazione sulla new (ho visto un tuo commento nel main)
la new chiama il costruttore della classe che alloca, e' il suo compito :-)
ciao
david

 Hmm includi string e poi usi un char*.... perche'?
perchè <string.h> in C contiene quel che in C++ trovi in
<cstring> che è diverso da quello che trovi in <string>
--
Gerolamo

 #include <string>
attento: <string.h> contiene le funzioni per manipolare i char*, tipo 
strlen & C., mentre <string> contiene le dichiarazioni di basic_string e 
string. L'equivalente di <string.h> e` <cstring>, cosi` come 
l'equivalente di <stdlib.h> e` <cstdlib>, mentre <stdlib> non esiste.
ciao Anto
-- 
"Computer science is not about computers any more than astronomy
is about telescopes." -- EW Dijkstra

Ragazzi ma il mio poblema non erano gli header!Potete aiutarmi a capire come
si implementano i metodi che vi ho lasciato che sono il mio vero
problema!Thanks!

 wrote

Non puoi essere piu' specifico?
Quale o quali? Cosa devono fare?
etc..... insomma, dacci del materiale su cui lavorare e non rigurgitarci e
basta del codice....
Tommy


1) Mi è stato chiesto di usare il metodo set_dati nel costruttore?Però non
sono ancora pratico di classi e vorrei capire cosa ho sbagliato nell'
implementazione del    metodo set_dato, di sicuro mi sono reso conto che non
è corretto passare le variabili private ai metodi voi come fareste, tuttvia
sembra che il metodo set_dati funzioni e quello che da problemi sembra
essere stampa_etichette?;
2)Mi è stato consigliato l'uso della libreria fstream per la stampa su
file!Il problema è che so che quando l'estensione di un oggetto è dinamica
bisogna ridefinire l'operatore, ad esmpio di output, centra con l'uso di
oggetti fstream o l'operatore bisogna ridefinirlo comunque?
 class Prodotti{
    protected :
      char* nome;
      float costo_unitario;
      ofstream out;
    public :
      Prodotti();
     void stampa_etichette(char* nome, float costo_unitario);
        void set_dati(char* nome, float costo_unitari);
      ~Prodotti();
 };
 #endif
#include "prodotti.h"
//costruttore;
 Prodotti::Prodotti(){
        Prodotti::set_dati(nome, costo_unitario);
}
void Prodotti::set_dati(char* nome, float costo_unitario){
     char temp[50];
     cin.ignore();
     cout << "\nNon Alimentari" << endl;
     cout << "\nNome Prodotto :";
     cin.getline(temp, 50);
     nome = new char[strlen(temp) + 1];
     strcpy(nome, temp);
     cout << "\nCosto unitario : ";
     cin >> costo_unitario;
}
void Prodotti::stampa_etichette(char* nome, float costo_unitario){
    ofstream file;


 wrote
[CUT]
Ogni volta che stampi qualche cosa, prodotto o alimentare che sia.....
chiami una funzione che contiene:
file.open("Prodotti.txt");
Quello che succede che ad ogni chiamata il file viene cancellato e quindi a
fine esecuzione avrai sempre e solo 1 prodotto!!!
prova a scrivere (in tutti i posti):
file.open("Prodotti.txt", ios::app);
e forse avrai piu' prodotti alla fine.
Intato ho dato una occhiata veloce, se non e' questo il problema fammi
sapere, tempo permettendo......
Tommy

 Tommy
No il problema era nel costruttore e sul metodo set_dati se dai un occhiata
alla mail precedente li c'è scritto quello che voglio sapere in
particolare!!