| 
 | |||||||
| 
 | 
|  | 
|  | 
|  | Strumenti | 
|  15-02-2011, 23:47 | #1 | 
| Senior Member Iscritto dal: Sep 2004 Città: Bolzano 
					Messaggi: 2160
				 | 
				
				[C++] Utilizzo di classe
			 
		Premetto che so programmare in Java. Java mi permette di istanziare classi scritte da me in un altra classe. Per spiegare vi faccio un breve esempio: Prima classe/primo file: Codice: public class ClasseA{
//variabili
//costruttore
//metodi
}Codice: public class Main{
public static void main(String[] args){
ClasseA = new ClasseA();
}Codice: #include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
class Book {
	string title;
	string author;
	int price;
public:
	Book(string, string, int);
	void printBook();
	void printBookPrice();
	string getTitle();
	string getAuthor();
	int getPrice();
	void setPrice(int);
};
Book::Book(string newTitle, string newAuthor, int newPrice) {
	title = newTitle;
	author = newAuthor;
	price = newPrice;
}
void Book::printBook() {
	cout << "The title of the book is: " << title << ".\n";
	cout << "The Author of the book is: " << author << ".\n";
}
void Book::printBookPrice() {
	cout << "Title: " << title << ". Author: " << author << ". Price: "
			<< price << "\n";
}
string Book::getTitle() {
	return title;
}
string Book::getAuthor() {
	return author;
}
int Book::getPrice() {
	return price;
}
void Book::setPrice(int newPrice) {
	price = newPrice;
}
				__________________ Vendo...nulla. Cerco...la felicità. | 
|   |   | 
|  16-02-2011, 00:19 | #2 | 
| Senior Member Iscritto dal: Oct 2005 
					Messaggi: 3306
				 | 
		Per prima cosa sposta la dichiarazione della classe Book in un file header Book.h (usa #pragma once all'inizio del file per evitare problemi con inclusioni multiple che altrimenti vengono sicuramente fuori) e l'implementazione la metti in Book.cpp che include Book.h oltre agli #include che hai già messo. using namespace std lo metti in Book.cpp, mentre in Book.h espliciti il namespace, nel tuo caso basta usare std::string. Per usare a questo punto la classe Book non dovrai fare altro che includere Book.h ovunque tu voglia usarla. Book.h: Codice: #pragma once
#include <string>
class Book {
	std::string title;
	std::string author;
	int price;
public:
        //meglio usare:
        //Book(const std::string &, const std::string &, int);
	Book(std::string, std::string, int);
	void printBook();
	void printBookPrice();
        //meglio usare:
        //const std::string & getTitle() const;
	std::string getTitle();
	std::string getAuthor();
	int getPrice();
	void setPrice(int);
};Codice: #include <iostream>
#include <stdlib.h>
#include <time.h>
#include <Book.h>
using namespace std;
Book::Book(string newTitle, string newAuthor, int newPrice) {
	title = newTitle;
	author = newAuthor;
	price = newPrice;
}
void Book::printBook() {
	cout << "The title of the book is: " << title << ".\n";
	cout << "The Author of the book is: " << author << ".\n";
}
void Book::printBookPrice() {
	cout << "Title: " << title << ". Author: " << author << ". Price: "
			<< price << "\n";
}
//meglio usare:
//const string & Book::getTitle() const
string Book::getTitle() {
	return title;
}
string Book::getAuthor() {
	return author;
}
int Book::getPrice() {
	return price;
}
void Book::setPrice(int newPrice) {
	price = newPrice;
}Inoltre per i metodi get è bene specificare l'attributo const per indicare che tali metodi non modificano la classe e che possono essere utilizzati da riferimenti const. Poi ci sarebbero un pò di dettagli mancanti, come l'utilizzo del costruttore di copia ecc... | 
|   |   | 
|  16-02-2011, 09:14 | #3 | 
| Senior Member Iscritto dal: Sep 2004 Città: Bolzano 
					Messaggi: 2160
				 | 
		Grazie della risposta celere. il "# pragma" non ò'avevo mai visto ne letto. Il "const" lo avevo gia notato in giro nei codici, ma non ho capito esattamente a cosa serve. 
				__________________ Vendo...nulla. Cerco...la felicità. | 
|   |   | 
|  16-02-2011, 14:27 | #4 | |
| Senior Member Iscritto dal: Oct 2005 
					Messaggi: 3306
				 | Quote: 
 Ad esempio se usassi la tua classe Book un codice del genere: Codice: const Book & book = GetBook(); string title = book.getTitle(); In C++ si parla di "const correctness" | |
|   |   | 
|  16-02-2011, 15:13 | #5 | 
| Senior Member Iscritto dal: Sep 2004 Città: Bolzano 
					Messaggi: 2160
				 | 
		Correggimi se sbaglio. In java basta che scrivo una classe, e posso riusarla dove voglio. In C++ devo sempre scrivere un file h e uno cpp?
		 
				__________________ Vendo...nulla. Cerco...la felicità. | 
|   |   | 
|  16-02-2011, 15:38 | #6 | 
| Senior Member Iscritto dal: Oct 2005 
					Messaggi: 3306
				 | |
|   |   | 
|  16-02-2011, 15:40 | #7 | 
| Senior Member Iscritto dal: Sep 2004 Città: Bolzano 
					Messaggi: 2160
				 | 
		
OK, perfetto. Proverò a programmare un pò....comunque devo prima andare a studiarmi sta cosa del "const" che non ho capito l'utilizzo. Grazie. 
				__________________ Vendo...nulla. Cerco...la felicità. | 
|   |   | 
|  16-02-2011, 16:59 | #8 | |
| Senior Member Iscritto dal: Sep 2004 Città: Bolzano 
					Messaggi: 2160
				 | Quote: 
 
				__________________ Vendo...nulla. Cerco...la felicità. | |
|   |   | 
|  16-02-2011, 18:07 | #9 | |
| Senior Member Iscritto dal: Oct 2005 
					Messaggi: 3306
				 | Quote: 
 Per il passaggio di oggetti in C++ è buona norma usare i riferimenti per motivi di performance (per i puntatori si apre un discorso a parte, ma lasciamolo perdere per il momento). Nel tuo caso quando chiami il costruttore crei una copia delle stringhe, mentre se usi il riferimento no. Con il riferimento nasce un problema però: te puoi modificare l'oggetto passato potenzialmente creando problemi al chiamante, pertanto si usa il modificatore const. In questo modo il chiamante sa che la tua classe non modificherà l'oggetto e contemporaneamente la tua classe non modificherà l'oggetto nemmeno per sbaglio. In ultimo i vantaggi prestazionali. Sempre per il solito motivo che è bene passare gli oggetti per riferimento e per il fatto che è bene che siano pure const per i motivi sopra elencati, se non hai specificato dei metodi come const non puoi utilizzare l'oggetto. Metti ad esempio che tu voglia modellare una libreria e tu abbia un metodo AddBook (l'implementazione è tarata sull'esempio): Codice: map<string, Book> books;
void Library::AddBook(const Book & book)
{
    map[book.getTitle()] = book;
} | |
|   |   | 
|  16-02-2011, 18:48 | #10 | 
| Senior Member Iscritto dal: Sep 2004 Città: Bolzano 
					Messaggi: 2160
				 | 
		OK, tutto sommato ho capito. Diciamo che il punto è se uso il passaggio by reference o meno. Ma usando il costruttore come ho fatto io, in pratica creando copie di stringhe, a parte le prestazioni ho altri svantaggi? 
				__________________ Vendo...nulla. Cerco...la felicità. | 
|   |   | 
|  17-02-2011, 16:43 | #11 | 
| Senior Member Iscritto dal: Sep 2004 Città: Bolzano 
					Messaggi: 2160
				 | 
		....noto solo ora che facendo copia incolla del codice scritto da te, Book.cpp e Book.h, mi da errore su #include <Book.h> dicendo No such file or directory. EDIT facendo #include "Book.h" funziona. 
				__________________ Vendo...nulla. Cerco...la felicità. Ultima modifica di Emaborsa : 17-02-2011 alle 16:48. | 
|   |   | 
|  17-02-2011, 17:04 | #12 | 
| Senior Member Iscritto dal: Apr 2010 Città: Frosinone 
					Messaggi: 416
				 | 
		
in realtà è anche una questione semantica.. se un metodo non modifica l'oggetto (come può essere un getter) allora dovrebbe essere dichiarato const
		 | 
|   |   | 
|  17-02-2011, 17:42 | #13 | |
| Senior Member Iscritto dal: Sep 2004 Città: Bolzano 
					Messaggi: 2160
				 | Quote: 
 Lui mi ha scritto: Codice: //meglio usare:
//const string & Book::getTitle() const
string Book::getTitle() {
	return title;
}Codice: const string & Book::getTitle() const {
	return title;
}Inoltre perchè la referenza & prima di Book? 
				__________________ Vendo...nulla. Cerco...la felicità. | |
|   |   | 
|   | 
| Strumenti | |
| 
 | 
 | 
Tutti gli orari sono GMT +1. Ora sono le: 06:35.









 
		 
		 
		 
		







 
  
 



 
                        
                        










