Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 25-10-2006, 20:46   #1
ka0s
Member
 
Iscritto dal: Nov 2005
Messaggi: 151
[C++] gestire in un progetto piu file (.cpp, .hpp)

Avevo sviluppato un programma che usava una matrice di char di dimensione 3x3 dichiarata come variabile globale:

char board[3][3];

Adesso vorrei espandere un po' le funzionalità del programma, creando una classe che faccia riferimento a questa matrice. Come faccio?

Ho provato a scrivere una classe di prova in un file "Nomeclasse.cpp" e poi ho aggiunto #include <Nomeclasse.cpp> nel file "main.cpp". Però non funziona, non lo trova... come si deve fare? Uso Dev-Cpp e anche facendo un progetto ed aggiungendoci i file non va...

Altra domanda (che servirà una volta risolto il problema esposto sopra): come faccio, da una classe, ad accedere a questa matrice (dichiarata come var. globale e che viene usata da altre parti del programma)?
Ad esempio mettiamo che io voglia creare un oggetto che rappresenti una riga della matrice (quindi deve rappresentare la riga board[0][0], board[0][1], board[0][2]) e fare operazioni sulle tre differenti posizioni, come si fa?

Grazie in anticipo a tutti!
__________________
ka0s
ka0s è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2006, 10:18   #2
ka0s
Member
 
Iscritto dal: Nov 2005
Messaggi: 151
Sono riuscito a risolvere parzialmente...

Mettiamo che abbia un file "main.cpp", uno "classe.hpp" e uno "classe.cpp".
Adesso ho bisogno di creare un altro sorgente "nuovo.cpp" che usi e modifichi degli oggetti creati all'interno di "main.cpp" (creati usando ovviamente classe.hpp e classe.cpp). Come si fa?
__________________
ka0s
ka0s è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2006, 11:04   #3
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
No attenzione, non è affatto una buona cosa includere un sorgente .cpp con #include !!!
Nei linguaggi C/C++ la tendenza è quella di cercare di separare il più possibile quelle che sono le dichiarazioni dalle implementazioni. In pratica nei file di include (.h o .hpp) si mettono le sole dichiarazioni (di classi, strutture, funzioni, ecc....) e nei sorgenti (.c, .cpp) si mettono le implementazioni vere e proprie.

Ecco un esempio banale di una classe per gestire le date:

File: data.h
Codice:
#ifndef DATA_H
#define DATA_H

class Data
{
public:
    Data (int giorno, int mese, int anno);
    ~Data ();

    void setGiorno (int giorno);
    void setMese (int mese);
    void setAnno (int anno);
    int getGiorno () const;
    int getMese () const;
    int getAnno () const;

private:
    int giorno;
    int mese;
    int anno;
};

#endif
File: data.cpp
Codice:
#include "data.h"

Data::Data (int giorno, int mese, int anno)
{
    this->giorno = giorno;
    this->mese = mese;
    this->anno = anno;
}

Data::~Data ()
{
}

void Data::setGiorno (int giorno)
{
    this->giorno = giorno;
}

void Data::setMese (int mese)
{
    this->mese = mese;
}

void Data::setAnno (int anno)
{
    this->anno = anno;
}

int Data::getGiorno () const
{
    return giorno;
}

int Data::getMese () const
{
    return mese;
}

int Data::getAnno () const
{
    return anno;
}
In qualunque altro sorgente che fa parte dello stesso progetto, quindi si dovrà includere solo data.h.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2006, 11:25   #4
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
E' buona norma non usare variabili globali nella programmazione Object Oriented...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2006, 11:59   #5
ka0s
Member
 
Iscritto dal: Nov 2005
Messaggi: 151
Quote:
Originariamente inviato da andbin
No attenzione, non è affatto una buona cosa includere un sorgente .cpp con #include !!!
Nei linguaggi C/C++ la tendenza è quella di cercare di separare il più possibile quelle che sono le dichiarazioni dalle implementazioni. In pratica nei file di include (.h o .hpp) si mettono le sole dichiarazioni (di classi, strutture, funzioni, ecc....) e nei sorgenti (.c, .cpp) si mettono le implementazioni vere e proprie.

Ecco un esempio banale di una classe per gestire le date:

File: data.h
(...)

File: data.cpp
(...)

In qualunque altro sorgente che fa parte dello stesso progetto, quindi si dovrà includere solo data.h.
Ok infatti ho fatto così, però mettiamo che io in "main.cpp" creo l'oggetto

Data compleanno(1,1,2006)

Adesso volendo modificare, da un altro sorgente qualunque, il giorno (con setGiorno) di compleanno, come devo fare?


Quote:
Originariamente inviato da cionci
E' buona norma non usare variabili globali nella programmazione Object Oriented...
Se è buona norma non usare var. globali come faccio? Tornando all'esempio di prima, dovendo usare una matrice 3x3 come faccio ad accederci e modificarla da diversi sorgenti?
__________________
ka0s
ka0s è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2006, 12:07   #6
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
La passi come parametro del costruttore (nel caso la matrice venga usate globalmente dalla classe) o come parametro dei metodi che la usano...

Invece se svolgi le stesse operazioni in diversi posti del codice (ad esempio somma delle righe e delle colonne) basta incapsulare la matrice all'interno di una classe che mette a disposizione alcuni emtodi che lavorano sulla matrice....poi la passi per riferimento ai costruttori e ai metodi che vogliono usare le operazioni che hai definito sulla matrice...

Ultima modifica di cionci : 26-10-2006 alle 12:09.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2006, 21:59   #7
ka0s
Member
 
Iscritto dal: Nov 2005
Messaggi: 151
Quote:
Originariamente inviato da cionci
La passi come parametro del costruttore (nel caso la matrice venga usate globalmente dalla classe) o come parametro dei metodi che la usano...

Invece se svolgi le stesse operazioni in diversi posti del codice (ad esempio somma delle righe e delle colonne) basta incapsulare la matrice all'interno di una classe che mette a disposizione alcuni emtodi che lavorano sulla matrice....poi la passi per riferimento ai costruttori e ai metodi che vogliono usare le operazioni che hai definito sulla matrice...
ok grazie proverò così!
__________________
ka0s
ka0s è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2006, 23:03   #8
ka0s
Member
 
Iscritto dal: Nov 2005
Messaggi: 151
Ho ancora dei problemi... allora ho fatto una classe "Board" che gestisce la matrice 3x3. Adesso vorrei fare una classe "Linea" in modo da poter creare vari oggetti che rappresentino le linee della matrice...

ad esempio usando

Linea linea1;
linea1.getPos1();

mi restituisce l'elemento in posizione 1 della prima riga... analogamente scrivendo linea3.getPos2() mi restituisce l'elemento in posizione 2 della terza riga (in pratica l'ottavo elemento della matrice).

Il fatto è che non riesco a 'far capire' alla classe "Linea" che esiste anche la classe "Board"... come bisogna fare?
__________________
ka0s
ka0s è offline   Rispondi citando il messaggio o parte di esso
Old 27-10-2006, 00:41   #9
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Fammi capire...board è un insieme di linee ?

Linea linea;

linea.get(1); //ritorna l'elemento 1 della linea...

Però, se board è un insieme di linee farei così:

Board board;

board.get(1, 2); //ritorna l'elemento 2 della linea 1...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 27-10-2006, 10:14   #10
ka0s
Member
 
Iscritto dal: Nov 2005
Messaggi: 151
No.. allora la classe Board permette di inserire un determinato carattere (o numero, insomma qualcosa) all'interno di una matrice 3x3 dichiarata come membro "private" al suo interno. In pratica fa gestire la matrice, permettendo inserimenti, accessi alle celle, ecc. ecc.

Quello di cui avrei bisogno è un'altra classe "Linea" che gestisca le righe e le colonne della matrice. Però ne ho bisono come se fossero oggetti a sè, per cui con Linea linea1 dovrei poter avere un oggetto "linea1" che mi permette di accedere alle tre posizioni (0,0; 0,1; 0,2) della prima riga della matrice...

forse è un po' contorto, ma spero di essermi spiegato!

EDIT: oppure conviene non fare questa seconda classe linea ed accedere alle linee della matrice semplicemente prendendo i riferimenti alle celle come hai detto tu... tipo board.get(1,1), ecc. ?? in ogni caso dato che mi serve anche come esercizio vorrei provare a risolverlo nel primo modo, giusto per capire come far interagire tra loro le cose!
__________________
ka0s

Ultima modifica di ka0s : 27-10-2006 alle 10:23.
ka0s è offline   Rispondi citando il messaggio o parte di esso
Old 27-10-2006, 16:14   #11
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Allora rendi Board una collection di linee...giusto per esercizio

class Board
{

public:

Linea & get(int indice);
}

class Linea
{

public:

char get(int indice);
void set(int indice, valore);
}

Oppure se conosci l'overloading degli operatori, potresti fare l'overloading dell'operatore []
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 27-10-2006, 23:33   #12
ka0s
Member
 
Iscritto dal: Nov 2005
Messaggi: 151
grazie!
__________________
ka0s
ka0s è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
iPhone Fold: scorte limitate al lancio m...
OpenAI porterà la pubblicità in ChatGPT ...
TSMC aumenterà ancora i prezzi: nel 2026...
Marvel pubblica anche il secondo teaser ...
Nuovo accordo tra xAI e il Pentagono: l'...
La famiglia Xiaomi 17 sta per registrare...
Nuove auto elettriche che vedremo sul me...
E-bike illegali, a Verona il più ...
Quali sono i giochi più venduti su Steam...
HONOR sta per lanciare un nuovo smartpho...
Jared Isaacman sarà alla guida de...
Il Tesla Cybertruck non arriverà ...
Xiaomi Watch 5 è ufficiale: architettura...
CD Projekt vende GOG: il co-fondatore Mi...
Il meglio di Amazon in 26 prodotti, aggi...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 02:56.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v