DOMANDA Come faccio a creare un vettore ad oggetti di due tipi contemporaneamente?

Mr.Cobra

Nuovo Utente
69
1
Tornando alla questione originaria... ma fare un diagramma delle classi coinvolte proprio no?
Un libro è un libro (=una classe), un libro scientifico al più lo puoi definire come sottoclasse di libro (sempre che serva, altrimenti basta una stinga/attributo tipoLibro). Una libreria, proprio come nel mondo reale, non è un libro, contiene libri; una libreria a 50 posizioni è un banalissimo array a 50 posizioni (50 oggetti tutti dello stesso tipo: libro) oppure, se vuoi complicarti la vita una matrice (di oggetti) 5x10 o 10x5 o 2x25 o 25x2 (se la metti in una stanza alta 8-10 metri!).

Che io ricordi, per programmare a livello universitario per i corsi base di programmazione con C/C++ basta e avanza un complilatore decente qualsiasi (solitamente GCC) abbinato ad un editor che abbia almeno la sintassi colorata, o a un IDE semplice (sotto Windows per es va bene CodeBlocks). Quando mai chiedono l'uso di STL? Magari in corsi più avanzati di programmazione a oggetti, non in fondamenti di informatica/programmazione-1

Si si infatti l'ho detto nel mio corso le stl non si fanno a meno che non si faccia l'esame da 12 crediti(io l'ho da 9) e c'è anche un paio di capitoli in più che mi sono letto per curiosità.

Si il punto e che dovevo creare un array di oggetti ho pensato se faccio una libreria di tipo libro non posso specificare la stringa Ramo(classe derivata Scientifico)o la stringa Genere(classe derivata Letterale). In poche parole vedete se ho capito dichiarando Libro il mio vettore posso ampliare l'oggetto libro alle due classe derivate? La classe base può accedere a quelle derivate?
 

Mr.Cobra

Nuovo Utente
69
1
Dipende anche qui dall'architettura specifica.
Esiste x86, ma da anni ormai si vedono solo CPU a 64bit (x64).

Si tratta ormai di CPU molto complesse. La natura stessa delle CPU CISC (Complex Instruction Set Computer) lo è. Esistono poi un sacco di set di istruzioni che apportano nuove aggiunte.
In generale, se vuoi studiare Intel, ti conviene ancora mettere mano su 8086. Senza soffermarti molto su concetti relegati all'epoca. 8086 è già complessa, ma è molto più semplice delle CPU attuali; in questo modo però riuscirai ad apprendere un pò di concetti che sono validi tuttora (e poi, i registri attuali sono un'estensione).
Puoi iniziare a dare un occhio al mio articolo che trovi in questa sezione se vuoi.

PS. scusa se ho risposto tagliando corto, ma sono un pò di fretta. Se hai domande torno a rispondere più tardi, probabilmente.
Va bene dopo che faccio gli esami così ho una base più solida me li leggerò sicuramente, tu hai una rubrica su questi argomenti? Ma per quanto riguarda il BIOS ci sono sezioni dedicate se approfondisco il linguaggio assembly capirei meglio come è fatto e come gestirlo? E' sicuro il bios?
 

Mr.Cobra

Nuovo Utente
69
1
Il C++ viene utilizzato largamente nella scrittura di kernel, engine di motori grafici, alcuni servizi dove le performance contano davvero. Nel mondo web la presenza è molto scarsa "ad alto livello", cosa che cambia se sviluppi i linguaggi stessi (es. PHP e relativi moduli).

Nel 2009 viene annunciato golang da Google, che si vuole porre come nuovo e potente linguaggio di programmazione atto alla standardizzazione del codice e facilità di sviluppo, non disgiunti da performance di linguaggi come appunto il C++. Da allora tutti i nuovi servizi che Google crea o refattorizza vengono infatti sviluppati in tale linguaggio. Go è un linguaggio imperativo, non ad oggetti e... per quanto possa sembrare assurdo all'inizio, non ti viene la bile su! Da quando l'ho provato ho subito provato amore per quel linguaggio.

C#? Java? Sono linguaggi compilati JIT, vedili come una pappetta pronta (in parte pre-compilata) pronta da essere digerita dalla virtual machine ed eseguiti... questo comporta il fatto che possono essere facilmente portati su più sistemi operativi, cosa che lo è effettivamente. Sono linguaggi sempre ad oggetti, onestamente credo che ad oggi si inseguano a vicenda, ma... che ne dici se ti dicessi che il futuro di Java non è Java, ma Kotlin? Nato per essere Java-compatibile, sembra un misto di ECMAScript, python e simili, atto a semplificare di molto la sintassi di Java. Pure Oracle ci sta lavorando sopra.

Tutto questo per dire: ci sono un'infinità di linguaggi, molti dei quali probabilmente prenderanno piede ed altri vedranno il declino, oppure verranno ridimensionati. Per ora focalizzati pure sul C++ che è una grande palestra di vita... io dal C++ non ci ho messo molto a passare al PHP (linguaggio che mi permette di comprarmi la pagnotta ad oggi!), ma ho conosciuto ed apprezzo molto altri linguaggi (come il Grande amOre :D ).

EDIT: mi sono perso la seconda pagina :D

P.S.
DevC++ è semplicemente un software dell'era anti-diluviana, ma fa perfettamente il suo lavoro. Alternative? CLion, a pagamento, per esempio. Ma anche vim :fumato:no joking. Atom, SublimeText... chi più ne ha, più ne metta.

Grazie mille a tutti per le curiosità che mi levate ci sono sezioni che posso leggere che trattano questi argomenti? Articoli ecc...?
 

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
Si si infatti l'ho detto nel mio corso le stl non si fanno a meno che non si faccia l'esame da 12 crediti(io l'ho da 9) e c'è anche un paio di capitoli in più che mi sono letto per curiosità.

Si il punto e che dovevo creare un array di oggetti ho pensato se faccio una libreria di tipo libro non posso specificare la stringa Ramo(classe derivata Scientifico)o la stringa Genere(classe derivata Letterale). In poche parole vedete se ho capito dichiarando Libro il mio vettore posso ampliare l'oggetto libro alle due classe derivate? La classe base può accedere a quelle derivate?
L’ideale è utilizzare un puntatore a Libro. Così è possibile utilizzare gli override dei metodi.
Se vuoi invece utilizzare certe proprietà che sono esclusive di LibroScientifico e LibroLetteratura sono problemi. Va detto che pure un Libro ha un Ramo e un Genere. È quindi tutta l’implementazione che ha lacune.
Altrimenti basta utilizzare due vettori, uno per LibroLetteratura e uno per LibroScientifico e poi per metodi tipo Libro* GetLibro(string name) fai una ricerca lineare sui due vettori e restituisci un puntatore. Non so se con decltype sia possibile evitare il puntatore ma per ora il mio PC è KO. Sicuramente con std::vector è possibile.
Va bene dopo che faccio gli esami così ho una base più solida me li leggerò sicuramente, tu hai una rubrica su questi argomenti? Ma per quanto riguarda il BIOS ci sono sezioni dedicate se approfondisco il linguaggio assembly capirei meglio come è fatto e come gestirlo? E' sicuro il bios?
Forse è meglio prima gestire l’alto livello visto che mettere mano all’Assembly per quanto riguarda il BIOS richiede vaste conoscenze generali e dell’architettura utilizzata.
 
  • Mi piace
Reazioni: Mr.Cobra

Mr.Cobra

Nuovo Utente
69
1
Se vuoi invece utilizzare certe proprietà che sono esclusive di LibroScientifico e LibroLetteratura sono problemi. Va detto che pure un Libro ha un Ramo e un Genere. È quindi tutta l’implementazione che ha lacune.
Si ma questo è la domanda del mio topic quali sono le lacune?

Altrimenti basta utilizzare due vettori, uno per LibroLetteratura e uno per LibroScientifico e poi per metodi tipo Libro* GetLibro(string name) fai una ricerca lineare sui due vettori e restituisci un puntatore.

Infatti questa lo avevo pensato anche io di creare due vettori il problema e che devo usarne uno solo e qui che mi sono bloccato
 

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro

Mr.Cobra

Nuovo Utente
69
1
Considerare ogni genere una classe.
Il problema è che devo fare libro base le altre due derivate e fare sto benedetto vettore!

Allora poliformismo

Avevo scritto così nel codice secondo te va bene?

C++:
class Scientifico: public virtual Libro{...
                                       }

class Letteratura: public virtual Libro{...
                                       }


C++:
#ifndef LIBRERIA_H
#define LIBRERIA_H

#include "Scientifico.h"
#include "Letteratura.h"

namespace Libreria{

    class Libreria:public Scientifico, public Letteratura{



    };

}

#endif

Tu come faresti?
 

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
Il problema è che devo fare libro base le altre due derivate e fare sto benedetto vettore!



Avevo scritto così nel codice secondo te va bene?

C++:
class Scientifico: public virtual Libro{...
                                       }

class Letteratura: public virtual Libro{...
                                       }


C++:
#ifndef LIBRERIA_H
#define LIBRERIA_H

#include "Scientifico.h"
#include "Letteratura.h"

namespace Libreria{

    class Libreria:public Scientifico, public Letteratura{



    };

}

#endif

Tu come faresti?
Ancora? Libreria non deriva da Libro...
 
  • Mi piace
Reazioni: Mr.Cobra

Mr.Cobra

Nuovo Utente
69
1
Ancora? Libreria non deriva da Libro...
Hai perfettamente ragione sono un ralph :asd::asd:
giphy.gif

Ho fatto mente locale vedi se come l'ho pensato può funzionare :

C++:
#ifndef LIBRERIA_H
#define lIBRERIA_H
#include <iostream>
#include "Libreria.h"

using namespace std;
namespace Libreria{
   
typedef Libro* pntLibro; /*per ora in questi programmi uso il typedef che mi hanno insegnato
una volta fatto l'esame approfondisco l'using penso che su tecniche Avanzate dietel lo trovo?
*/
class Libreria{
   
    public:
    static const int N=100;      
    pntLibro vett[N];          
    int cont;                              
   
    public:
        Libreria(){cont=0;}
       
        int Insert(const pntLibro);
        pntVeicolo Estrai(const int&);
        bool Print() const;
       
        bool Empty() const {return cont==0;}
        bool Full() const{return cont==N;}
};
}

#endif

Se ad esempio nel main faccio così penso che vada bene no?

C++:
int main(int argc, char** argv) { \\perchè mi da sempre questi due elementi nel main quando creo un prgetto? che cosa sono?

Libreria Lib;
Libro* temp;
ofstream of;

cout<<"Inserisci Libro Scientifico [Autore, Editore, Ramo]"<<endl;
temp = new Scientifico();
cin>>*temp;
if(!Lib.Full()){
cout<<"Libro assegnato al posto numero: ";
out<<Lib.Insert(temp)<<endl;
}else
cout<<"Libreria Piena"<<endl;

}
Questo è un esempio con Scientifico poi lo migliorerò e faro funzioni di ricerca ecc..
 

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
Hai perfettamente ragione sono un ralph :asd::asd:
Visualizza allegato 306447

Ho fatto mente locale vedi se come l'ho pensato può funzionare :

C++:
#ifndef LIBRERIA_H
#define lIBRERIA_H
#include <iostream>
#include "Libreria.h"

using namespace std;
namespace Libreria{
  
typedef Libro* pntLibro; /*per ora in questi programmi uso il typedef che mi hanno insegnato
una volta fatto l'esame approfondisco l'using penso che su tecniche Avanzate dietel lo trovo?
*/
class Libreria{
  
    public:
    static const int N=100;     
    pntLibro vett[N];         
    int cont;                             
  
    public:
        Libreria(){cont=0;}
      
        int Insert(const pntLibro);
        pntVeicolo Estrai(const int&);
        bool Print() const;
      
        bool Empty() const {return cont==0;}
        bool Full() const{return cont==N;}
};
}

#endif

Se ad esempio nel main faccio così penso che vada bene no?

C++:
int main(int argc, char** argv) { \\perchè mi da sempre questi due elementi nel main quando creo un prgetto? che cosa sono?

Libreria Lib;
Libro* temp;
ofstream of;

cout<<"Inserisci Libro Scientifico [Autore, Editore, Ramo]"<<endl;
temp = new Scientifico();
cin>>*temp;
if(!Lib.Full()){
cout<<"Libro assegnato al posto numero: ";
out<<Lib.Insert(temp)<<endl;
}else
cout<<"Libreria Piena"<<endl;

}
Questo è un esempio con Scientifico poi lo migliorerò e faro funzioni di ricerca ecc..
Va bene, però attento che vedo che ti confondi con altri progetti (roba tipo Veicolo).
typedef e using sono alias e fanno la stessa identica cosa, ma a meno che tu non stia programmando con extern "C" o altro codice compatibile con C dovresti usare using. E no, non lo trovi in quel libro, che io ho letto in inglese versione C++11. Quel libro da infarinatura sui template (ma poca poca roba), spiega bene <iostream>, strutture, contenitori della STL e stringhe C-Type.
int main(...) è la funzione di partenza che _start() chiama. _start() popola l’array di stringhe argv e lo passa al main insieme al numero di stringhe. Rappresenta i parametri che possono essere inviati al main. Se l’eseguibile non è chiamato da nessun altro eseguibile si omettono.

Comunque la funzione Insert() è errata. Dovrebbero essercene due, una che chiede un reference a LibroS. (o meglio un rvalue reference) che utilizza per inizializzare la memoria, e l’altra che chiede un LibroL. Poi il reference ad int in Estrai(const int) non serve, e nemmeno il const. Poi dovrebbe restituire un reference a quella parte di memoria.

Comunque evita di usare ostream ecc... se non sai usarli. Ed evita anche la memoria dinamica perché non credo tu la sappia usare bene
 
  • Mi piace
Reazioni: Mr.Cobra

Mr.Cobra

Nuovo Utente
69
1
Comunque la funzione Insert() è errata. Dovrebbero essercene due, una che chiede un reference a LibroS. (o meglio un rvalue reference) che utilizza per inizializzare la memoria, e l’altra che chiede un LibroL. Poi il reference ad int in Estrai(const int) non serve, e nemmeno il const. Poi dovrebbe restituire un reference a quella parte di memoria.
Comunque evita di usare ostream ecc... se non sai usarli. Ed evita anche la memoria dinamica perché non credo tu la sappia usare bene
Le devo usare per forza devo abituarmici nei compiti in classe sono elementi fissi.
Solo una cosa, questo programma non è mio l'ho trovato tra materiali vari, lui crea un puntatore Libro * temp della classe base e inizializza un oggetto dinamicamente a questo puntatore alla classe derivata Scientifico come fa? Perchè?Non voglio dire idiozie forse mi sto confondendo, gli oggetti delle classi derivate sono anche oggetti di quelle delle classi base?Oppure ha "forzato" la classe base? Cioè ha inserito nel registro di memoria di Libro elementi anche di Scientifico?
 

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
Le devo usare per forza devo abituarmici nei compiti in classe sono elementi fissi.
Solo una cosa, questo programma non è mio l'ho trovato tra materiali vari, lui crea un puntatore Libro * temp della classe base e inizializza un oggetto dinamicamente a questo puntatore alla classe derivata Scientifico come fa? Perchè?Non voglio dire idiozie forse mi sto confondendo, gli oggetti delle classi derivate sono anche oggetti di quelle delle classi base?Oppure ha "forzato" la classe base? Cioè ha inserito nel registro di memoria di Libro elementi anche di Scientifico?
http://www.html.it/pag/15523/metodi-virtuali-introduzione-al-polimorfismo-in-c/
 
  • Mi piace
Reazioni: Mr.Cobra

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!