Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Tra audio e AI: la ricetta di Qualcomm per l'agentic AI
Tra audio e AI: la ricetta di Qualcomm per l'agentic AI
Snapdragon Soung Gen 2 è la piattaforma Qualcomm per i dispositivi audio sempre più integrati nel mondo dell'intelligenza artificiale: al prorpio interno tanta potenza elaborativa per gestire al meglio le necessità d'uso dell'agentic AI
Qualcomm annuncia la nuova generazione di SoC Snapdragon 8 Elite Gen 6
Qualcomm annuncia la nuova generazione di SoC Snapdragon 8 Elite Gen 6
In occasione del proprio Snapdragon Summit Qualcomm annuncia i due nuovi chip per dispositivi mobile di fascia alta che entreranno nel mercato nel corso del 2027: tanta potenza a disposizione per elaborazioni di intelligenza artificiale sempre più complesse
realme 16 Pro Harry Potter Edition: il nuovo midrange ha uno stemma di Hogwarts che cambia colore al sole!
realme 16 Pro Harry Potter Edition: il nuovo midrange ha uno stemma di Hogwarts che cambia colore al sole!
Hogwarts arriva in fascia media grazie a realme, con una special edition che unisce la Quadra Light-Sensing Color-changing Tech, un baule in stile Hogwarts Express pieno di collezionabili e una scheda tecnica sostanzialmente identica al 16 Pro di partenza: ecco cosa cambia davvero, come si comporta nell'uso quotidiano e quanto vale in base al prezzo di 699,99 euro
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-03-2008, 16:56   #1
crystal86
Junior Member
 
Iscritto dal: Mar 2008
Messaggi: 10
[c++]template di classe

Buonasera. Ho un piccolo problema da esporre. Ho questa classe:

Codice:
#ifndef ATTRIBUTOVALORE_H
#define ATTRIBUTOVALORE_H
#include "string.h"

using namespace std;

template <class T>
class AttributoValore{
    
    public:
             AttributoValore(T,string);
             ~AttributoValore();
             bool setAttribute(string Attribute);
             bool setValue(T Value);
             T getValue();
             string getAttribute();
    private:         
             T value;
             string attribute;
};

#endif
e poi ho definito quest'altra classe:

Codice:
#ifndef FATTO_H
#define FATTO_H
#include <list>
#include <string>
#include "attributovalore.h"

using namespace std;


class Fatto {
      
      public:
             Fatto(AttributoValore AV);
             ~Fatto();
             bool setFactName(string name);
             bool addAttVal(AttributoValore AV);
      private:
              string Name;
              list<AttributoValore> Attributi;
};

#endif
in fase di compilazione mi da errore precisamente quando vado a definire variabili di tipo "AttributoValore". Mi da errori del tipo manca la virgola o la parentesi. Credo il problema sia dovuto al fatto che ho usato i template di classe. Qualcuno sa illuminarmi? grazie in anticipo
crystal86 è offline   Rispondi citando il messaggio o parte di esso
Old 21-03-2008, 17:09   #2
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quando usi la classe parametrica devi indicare al compilatore che tipo vuoi:

AttributoValore<int>
AttributoValore<char>
AttributoValore<MyClass>

In questo modo il compilatore e' in grado di generare una classe completa usando rispettivamente int, char o MyClass al posto di T.
Inoltre devi dichiarare tutti i metodi della classe template inline nel .hpp di modo che il compilatore li abbia disponibili al momento dell'instanziazione del template.

Ti stai andando a cacciare in un grosso guaio con i template, occhio.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 21-03-2008, 17:22   #3
crystal86
Junior Member
 
Iscritto dal: Mar 2008
Messaggi: 10
quindi devo per forza già dire adesso quale sarà il tipo T, e non c'è un modo per dirlo successivamente?

comunque adesso ho modificato la classe cosi

Codice:
#ifndef FATTO_H
#define FATTO_H
#include <list>
#include <string>
#include "attributovalore.h"

using namespace std;

typedef AttributoValore <int> AttributoV;

class Fatto {
      
      public:
             Fatto(AttributoV AV);
             ~Fatto();
             bool setFactName(string name);
             bool addAttVal(AttributoV AV);
      private:
              string Name;
              list<AttributoV> Attributi;
};

#endif
e mi da ancora errore precisamente:
Codice:
C:\Documents and Settings\Teddy\Documenti\Università\ICSE\Interprete\fatto.o(.text$_ZSt8_DestroyI15AttributoValoreIiEEvPT_[void  std::_Destroy<AttributoValore<int> >(AttributoValore<int>*)]+0xd) In function `ZNSt10_List_baseI15AttributoValoreIiESaIS1_EE11_M_get_nodeEv': 

[Linker error] undefined reference to`AttributoValore<int>::~AttributoValore()'
ho controllato il codice ma non mi pare ci siano errori di sintassi. Idee in merito? grazie per le risposte
crystal86 è offline   Rispondi citando il messaggio o parte di esso
Old 21-03-2008, 17:31   #4
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da crystal86 Guarda i messaggi
quindi devo per forza già dire adesso quale sarà il tipo T, e non c'è un modo per dirlo successivamente?
La classe template e' proprio il modo di implementare un comportamento per il quale il tipo esatto non e' ancora conosciuto, e verra' indicato dopo. Quando usi la classe template devi indicare il tipo, altrimenti il compilatore non sa che quale codice generare perche' non gli dici che cosa e' T.


Quote:
[Linker error]
Devi implementare i metodi della classe template, se non li scrivi il compilatore come fa a sapere che cosa fa ogni metodo?

Esempio:

Codice:
class MyFirstTemplate<typename T>
{
  MyFirstTemplate()
  {
     // initialise class here
  }

  T Get(T& x) const
  {
     return x;
  }
};


void main()
{
  MyFirstTemplate<int> object_of_int; // instatiate MyFirstTemplate<int> here (well, a bit above)
  
  assert(5 == object_of_int.Get(5)); // works!?
}

Ultima modifica di fek : 21-03-2008 alle 17:35.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 21-03-2008, 17:39   #5
crystal86
Junior Member
 
Iscritto dal: Mar 2008
Messaggi: 10
Ho capito la questione dei template.

Per quanto riguarda il codice avevo già implementato i metodi:

della prima classe

Codice:
#include <iostream>
#include "attributovalore.h"
#include "string.h"

using namespace std;

template <class T>
AttributoValore<T>::AttributoValore(T valore, string attributo) 

{
                  
                  value=valore;
                  attribute=attributo;
                                    
}

template <class T>
AttributoValore<T>::~AttributoValore(){
                   
                   cout<<"Coppia attributo-valore eliminata\n";
}

template <class T>
bool AttributoValore<T>::setAttribute(string Attribute)

{
     attribute=Attribute;
     if (attribute=="") 
     
        return false;
        
        else 
             return true;
}

template <class T>
bool AttributoValore<T>::setValue(T Value)

{
     value=Value;
     if (value=="") 
     
        return false;
        
        else 
             return true;
}
e della seconda classe
Codice:
#include "fatto.h"
#include <string>
#include <list>
#include <iostream>
#include "attributovalore.h"

using namespace std;

Fatto::Fatto(AttributoV AV){
               
     Attributi.push_front(AV);
               
               }

Fatto::~Fatto(){
                
                cout<<"Fatto eliminato\n";    
                
}

bool Fatto::addAttVal(AttributoV AV) 
{
     
     Attributi.push_front(AV);
     if(Attributi.empty())
        return true;
     else
         return false;
}

bool Fatto::setFactName(string name)
{
     Name=name;
     if(Name=="")
        return false;
     else 
          return true;
}
il problema persiste. Ho provato a utilizzare la classe AttributoValore in un altro progetto e in fase di compilazione non mi da errori. Presumo quindi che il problema sia nella classe Fatto.
crystal86 è offline   Rispondi citando il messaggio o parte di esso
Old 21-03-2008, 17:41   #6
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da crystal86 Guarda i messaggi
il problema persiste. Ho provato a utilizzare la classe AttributoValore in un altro progetto e in fase di compilazione non mi da errori. Presumo quindi che il problema sia nella classe Fatto.
No, il problema e' che devi implementare i metodi inline come ho fatto io nel mio esempio. Il compilatore deve avere l'intera definizione della classe e dei suoi metodi in ogni unita' di traslazione che istanzia un template. Tante parole difficili per dire: definisci i metodi della classe template inline nel file .h, includilo dove usi la classe template, e funzionera' tutto.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 21-03-2008, 18:00   #7
crystal86
Junior Member
 
Iscritto dal: Mar 2008
Messaggi: 10
Quote:
Originariamente inviato da fek Guarda i messaggi
No, il problema e' che devi implementare i metodi inline come ho fatto io nel mio esempio. Il compilatore deve avere l'intera definizione della classe e dei suoi metodi in ogni unita' di traslazione che istanzia un template. Tante parole difficili per dire: definisci i metodi della classe template inline nel file .h, includilo dove usi la classe template, e funzionera' tutto.
grazie mille ho risolto come hai detto tu. Senti ma il fatto che non posso separare l'implementazione dei metodi dalla definizione della classe è dovuto all'uso dei template?
crystal86 è offline   Rispondi citando il messaggio o parte di esso
Old 22-03-2008, 00:22   #8
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
Sì...questo perché le classi relative ai vari tipi di dati vengono generate in fase di compilazione.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 22-03-2008, 11:21   #9
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da crystal86 Guarda i messaggi
grazie mille ho risolto come hai detto tu. Senti ma il fatto che non posso separare l'implementazione dei metodi dalla definizione della classe è dovuto all'uso dei template?
Si', come ha detto cionci il codice che deriva da una classe template e' generato a tempo di compilazione.
Il processo si chiama istanziazione di un template: ogni volta che indichi esplicitamente i tipi associati ad una classe template, il compilatore crea letteralmente il codice di una nuova classe in quel punto (un po' prima in realta') e relativi metodi, sostituendo letteralmente ai tipi parametrici i tipi reali che hai indicato. Per fare questo ha bisogno di tutte le informazioni della classe template, quindi di tutte le dichiarazioni e tutti i metodi implementati.
fek è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Tra audio e AI: la ricetta di Qualcomm per l'agentic AI Tra audio e AI: la ricetta di Qualcomm per l'age...
Qualcomm annuncia la nuova generazione di SoC Snapdragon 8 Elite Gen 6 Qualcomm annuncia la nuova generazione di SoC Sn...
realme 16 Pro Harry Potter Edition: il nuovo midrange ha uno stemma di Hogwarts che cambia colore al sole! realme 16 Pro Harry Potter Edition: il nuovo mid...
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce Recensione REDMI Note 17 Pro: il midrange con ba...
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema Insta360 Luna Ultra: la potenza del sensore da 1...
11 novità rilevanti nella nostra ...
Il tempo non è mai stato misurato...
Le auto elettriche sono più longe...
Stardock Snipboard: il dock che vuole ma...
Logitech G PRO X SUPERLIGHT 2 e SE, mous...
Supporto Linux in arrivo anche per i not...
Ninja MAX, la friggitrice ad aria da 6,2...
Poche scorte rimaste: Mini PC con Ryzen ...
Adobe Premiere è disponibile anche su An...
Sorpresa su Amazon: ora sono 2 le e-bike...
Galaxy S27, svelate le configurazioni di...
Gli studenti americani voltano le spalle...
Mercedes-Benz e Wayve si uniscono: guida...
Meta Muse Charm: sembra un Tamagotchi, m...
Ray-Ban Meta Audio: occhiali smart senza...
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: 09:14.


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