[C++] Come evitare di dichiarare globalmente

Messaggioda jack ishimaura » 03/01/2019, 23:13

Salve avrei bisogno di un consiglio.
Devo utilizzare una funzione che tra i suoi parametri ha una variabile passata per indirizzo di tipo struttura .

Codice:
#include <iostream>
#include <cstring>
#define N 50
using namespace std;
void struttura_function(char a[N],char b[N],struttura *variabile,int index);

int main()
{
    struct struttura{
   //ha diversi campi
      };
//altre istruzioni
 }


Quando dichiaro il prototipo però sorge un problema dal momento che questi non riconosce il tipo struttura.
Ora io potrei risolvere il problema facendo una cosa del genere :

Codice:
#include <iostream>
#include <cstring>
#define N 50
using namespace std;
struct struttura{
 
      };
void struttura_function(char a[N],char b[N],struttura *variabile,int index);
int main()
{
   
 }


tuttavia vorrei evitare di dichiarare globalmente .

Quindi cosa mi consigliate di fare?
Ultima modifica di stan il 05/02/2019, 16:34, modificato 2 volte in totale.
Motivazione: Aggiunto BBCode per il codice
jack ishimaura
Starting Member
Starting Member
 
Messaggio: 44 di 44
Iscritto il: 01/08/2017, 19:44

Re: [C++] Come evitare di dichiarare globalmente

Messaggioda Raptorista » 03/01/2019, 23:50

Moderatore: Raptorista

Ciao, usa i tag per il codice nei tuoi messaggi, che così sono difficili da leggere.


Perché non vuoi mettere la dichiarazione come globale?
Un matematico ha scritto:... come mia nonna che vuole da anni il sistema per vincere al lotto e crede che io, in quanto matematico, sia fallito perché non glielo trovo


Immagine
Avatar utente
Raptorista
Moderatore
Moderatore
 
Messaggio: 5153 di 5250
Iscritto il: 28/09/2008, 20:58

Re: [C++] Come evitare di dichiarare globalmente

Messaggioda Omi » 05/02/2019, 16:16

Se il tuo problema è puramente estetico, ti consiglio di studiare le librerie e quindi di dichiarare le intestazioni (quindi prototipi e variabili globali) in un file a parte. Capirai tutto studiando le librerie e su YT trovi dei corsi semplicissimi.
Omi
Starting Member
Starting Member
 
Messaggio: 2 di 2
Iscritto il: 04/02/2019, 18:02

Re: [C++] Come evitare di dichiarare globalmente

Messaggioda apatriarca » 06/02/2019, 21:46

Siccome la struttura è passata per riferimento puoi semplicemente dichiararla (la definizione sarà altrove). Si chiama "forward declaration" nel caso tu volessi fare qualche ricerca ulteriore a riguardo. In pratica puoi scrivere come segue:
Codice:
#include <iostream>
#include <cstring>

#define N 50

using namespace std;

struct struttura;

void struttura_function(char a[N], char b[N], struttura *variabile, int index);

int main()
{
    /* ... */
}

Nota tuttavia che se nel main hai l'intenzione di creare una variabile ti tipo struttura o accedere ad una qualsiasi delle sue variabili membro o accedere alla sua dimensione, dovrai rendere visibile tale struttura nel main. Un modo è quello di definire tale struttura in un header file e includerlo in ogni file che ha bisogno di lavorare sulla tua struttura.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5186 di 5214
Iscritto il: 08/12/2008, 21:37
Località: Londra

Re: [C++] Come evitare di dichiarare globalmente

Messaggioda Raptorista » 06/02/2019, 23:36

Omi ha scritto:su YT trovi dei corsi semplicissimi.

Attenzione con le risorse online. C'è una quantità immensa di materiale sul C++, la maggior parte del quale è di pessima qualità.
Un matematico ha scritto:... come mia nonna che vuole da anni il sistema per vincere al lotto e crede che io, in quanto matematico, sia fallito perché non glielo trovo


Immagine
Avatar utente
Raptorista
Moderatore
Moderatore
 
Messaggio: 5182 di 5250
Iscritto il: 28/09/2008, 20:58

Re: [C++] Come evitare di dichiarare globalmente

Messaggioda vict85 » 07/02/2019, 12:53

Se è un problema di linking puoi definire la struttura in un namespace.
vict85
Moderatore
Moderatore
 
Messaggio: 9486 di 9629
Iscritto il: 16/01/2008, 01:13
Località: Berlin

Re: [C++] Come evitare di dichiarare globalmente

Messaggioda marco2132k » 14/02/2019, 00:37

Eh però mettere struttura in f.d. sullo spazio globale è la stessa cosa di dichiararla completamente (più o meno, ad esempio se ha dati di tipi noti sul globale). Scavando tra quel poco di C++ che ricordo (e che ho imparato nel periodo che ho trascorso in un ITIS, quindi non è che sia "chissà cosa"), credo che la cosa migliore sia mettere la dichiarazione della struttura e la firma della funzione in un header.

Tieni presente che se in un .cpp avrai bisogno di utilizzare struttura_function, questo avverrà chiamandola su un oggetto di tipo struttura, che dovrà in qualche modo essere già stato definito1; supponendo però che l'implementazione di struttura_function necessiti di far ricorso ad un numero imprecisato di headres esterni (pensa semplicemente agli algoritmi di STL) completamente inutili nel resto del codice, con l'importazione di struttura.hpp risolvi il problema una volta per tutte, ché l'implementazione rimane isolata sul .cpp di implementazione. Ah probabilmente a distanza di due anni e mezzo dall'ultima volta che ho pensato a ciò, ho usato in modo casuale alcuni termini tecnici, spero sia chiaro lo stesso :-D

(struttura.hpp)
Codice:
#ifndef __STRUTTURA__
#define __STRUTTURA__

struct struttura {
  // dati
};

void struttura_function(char a[N], char b[N], struttura &variabile, int index); /* perché usi un puntatore e non &? e char[] al posto di std::vector<char> o (che credo sia il tuo caso) std::string? (ricordo che fanno risparmiare tante bestemmie) */

#endif


(struttura.cpp)
Codice:
#include "struttura.hpp"

void struttura_function(char a[N], char b[N], struttura &variabile, int index) {
  // cose
}

Note

  1. L'esercizio mi sembra un'imitazione di OOP fatta in C, quindi credo che struttura_function impersoni di fatto un metodo, rendendo lecito mettere nello stesso header dati e cose-che-operano-sui-dati.
marco2132k
Junior Member
Junior Member
 
Messaggio: 183 di 232
Iscritto il: 19/02/2018, 00:52

Re: [C++] Come evitare di dichiarare globalmente

Messaggioda apatriarca » 14/02/2019, 13:04

marco2132k ha scritto:Eh però mettere struttura in f.d. sullo spazio globale è la stessa cosa di dichiararla completamente (più o meno, ad esempio se ha dati di tipi noti sul globale). Scavando tra quel poco di C++ che ricordo (e che ho imparato nel periodo che ho trascorso in un ITIS, quindi non è che sia "chissà cosa"), credo che la cosa migliore sia mettere la dichiarazione della struttura e la firma della funzione in un header.

Una struttura deve essere dichiarata/definita in ogni unità di compilazione per poter essere utilizzata. La visibilità di questa definizione è "globale" solo se inclusa in diverse unite di compilazione. Una struttura dichiarata o definita all'interno di un header incluso in diverse unità di compilazione è quindi certamente più globale di una struttura definita all'interno di un singolo codice sorgente. Le operazioni che puoi fare su un tipo opaco sono inoltre molto più limitate rispetto ad una struttura di cui si conosce il contenuto. Puoi infatti creare solo puntatori o riferimenti e non puoi ottenerne la dimensione o fare aritmetica dei puntatori. È in effetti un metodo classico in C per definire strutture il cui contenuto si vuole tenere privato.

marco2132k ha scritto:Tieni presente che se in un .cpp avrai bisogno di utilizzare struttura_function, questo avverrà chiamandola su un oggetto di tipo struttura, che dovrà in qualche modo essere già stato definito; supponendo però che l'implementazione di struttura_function necessiti di far ricorso ad un numero imprecisato di headres esterni (pensa semplicemente agli algoritmi di STL) completamente inutili nel resto del codice, con l'importazione di struttura.hpp risolvi il problema una volta per tutte, ché l'implementazione rimane isolata sul .cpp di implementazione. Ah probabilmente a distanza di due anni e mezzo dall'ultima volta che ho pensato a ciò, ho usato in modo casuale alcuni termini tecnici, spero sia chiaro lo stesso :-D

Non tutte le funzioni che operano su una struttura o classe sono necessariamente accoppiate alla classe. In effetti è in generale meglio ridurre il numero di funzioni membro in favore di funzioni che utilizzano solo la parte pubblica della classe. Non c'è nulla di sbagliato in questo caso, probabilmente è la scelta corretta, ma non deve essere presa con una regola generale.

Ho l'impressione comunque che il corso sia più di C che di C++ (al massimo usando cose come std::cout) e che sia chiamato C++ principalmente perché viene usato un compilatore C++.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5191 di 5214
Iscritto il: 08/12/2008, 21:37
Località: Londra


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 5 ospiti