PDA

Visualizza la versione completa : [C++] "Best practice" nella creazione di classi


mlipreri
23-10-2007, 17:31
Ciao, ho creato 3 classi:

Monitor.h

#ifndef MONITOR_H_
#define MONITOR_H_
using namespace std;

class Monitor
{
private:
float frequenza;
string risoluzione;
string marca;

public:
void setFrequenza(float _frequenza);
float getFrequenza();
void setRisoluzione(string _risoluzione);
string getRisoluzione();
void setMarca(string _marca);
string getMarca();
}

#endif /*MONITOR_H_*/

Tastiera.h

#ifndef TASTIERA_H_
#define TASTIERA_H_


class Tastiera
{
private:
int tasti;
string marca;
public:
void setTasti(int _tasti);
int getTasti();
void setMarca(string _marca);
string getMarca();
}

#endif /*TASTIERA_H_*/

Computer.h che contiene un oggetto Tastiera e Monitor

#include "Monitor.h"
#include "Tastiera.h"
#ifndef COMPUTER_H_
#define COMPUTER_H_


class Computer
{
private:
string marca;
Monitor monitor;
Tastiera tastiera;
public:
void setMarca(string _marca);
string getMarca();
void setMonitor(Monitor _monitor);
Monitor getMonitor();
void setTastiera(Tastiera _tastiera);
Tastiera getTastiera();
}

#endif /*COMPUTER_H_*/

Ora dov'è che devo definire i metodi delle classi dato che qui ho dato solo l'implemenatzione? Lo faccio in un file .cpp tipo main.cpp o all'interno delle classi create? Qual'è il modo migliore?
Grazie

MItaly
23-10-2007, 17:51
In monitor.cpp, tastiera.cpp e computer.cpp. Quindi crea un main.cpp in cui si troverà il main che utilizzerà i vari oggetti.

mlipreri
23-10-2007, 17:57
Giusto, grazie!
Ancora una cosa...se creo Monitor.cpp, per esempio, e implemento il metodo:


void Monitor::setFrequenza(float _frequenza){

}

come faccio ad accedere alla varibile frequenza dichiarata in Monitor.h con private?
Devo per forza metterla pubblic?

MItaly
23-10-2007, 18:02
void Monitor::setFrequenza(float _frequenza){
frequenza = _frequenza;
}

:fagiano:
Perché dovresti dichiararla come public? I metodi della classe possono tranquillamente accedere ai membri private... altrimenti a cosa servirebbero i campi privati, se nessuno ci potesse accedere? :)

mlipreri
23-10-2007, 18:07
:zizi: ovvio :D

ma se faccio così nel file Monitor.cpp


#include "Monitor.h"
#include <iostream>
using namespace std;

Monitor::Monitor(){}

Monitor::~Monitor(){}

void Monitor::setMarca(string _marca){
marca = _marca;
}

mi dice:
prototype for "void Monitor::setMarca(std::string)" does not match any in class "Monitor"

.......come mia?

MacApp
23-10-2007, 18:41
Vedo i tre seguenti errori:

1. Devi mettere il ";" subito dopo la chiusura delle graffe delle dichiarazioni delle classi;


class ClasseErrata{
} // <- errore perché non c'è il ";"

class ClasseCorretta{
}; // <- corretto perché c'è il ";"

2. Definisci i metodi Monitor::Monitor () ed il distruttore della classe Monitor, ma non li dichiari;
3. Non includi il file "string".


#include <string>

mlipreri
24-10-2007, 10:14
ok, grazie per le dritte davvero molto utili e soprattutto mi funziona :).
Ora se nella classe Monitor vorrei aggiungere un metodo che mi ritornare l'oggetto Monitor in questione nel file "Monitor.h" dovrei aggiungere il seguente metodo pubblico:

Monitor getMonitor();
Mentre in "Monitor.cpp" dovrei implementare, io ho provato a farlo in questo modo:

Monitor Monitor::getMonitor(){
return this->Monitor;
}
Ma mi dice che l'oggetto monitor non è valido...qualche dritta?
E se volessi ritornare un puntatore alla classe Monitor come dovrei fare?
Grazie.

mlipreri
24-10-2007, 10:24
Ho risolto facendo così:

Monitor Monitor::getMonitor(){
return *this;
}
ma perchè prima non andava bene?
diciamo che ci sono arrivato per intuito ma non ne sono pienamente coscente :mame:
qualcuno mi illumina?
Grazie

MItaly
24-10-2007, 15:29
Ora se nella classe Monitor vorrei aggiungere un metodo che mi ritornare l'oggetto Monitor in questione nel file "Monitor.h"
Questo non ha nessun senso. A cosa dovrebbe servire un metodo che restituisce l'oggetto su cui lo stai chiamando? :dottò:

MacApp
24-10-2007, 15:47
Originariamente inviato da MItaly
Questo non ha nessun senso. A cosa dovrebbe servire un metodo che restituisce l'oggetto su cui lo stai chiamando? :dottò:
in realtà poi ne restituisce una copia..

Loading