Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni
Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni
Dal richiamo di Enrico Letta alla necessità di completare il mercato unico entro il 2028 alla visione di Nokia sul ruolo dell’IA e delle reti intelligenti, il Nokia Innovation Day 2025 ha intrecciato geopolitica e tecnologia, mostrando a Vimercate come la ricerca italiana contribuisca alle sfide globali delle telecomunicazioni
Sottile, leggero e dall'autonomia WOW: OPPO Reno14 F conquista con stile e sostanza
Sottile, leggero e dall'autonomia WOW: OPPO Reno14 F conquista con stile e sostanza
OPPO Reno14 F 5G si propone come smartphone di fascia media con caratteristiche equilibrate. Il device monta processore Qualcomm Snapdragon 6 Gen 1, display AMOLED da 6,57 pollici a 120Hz, tripla fotocamera posteriore con sensore principale da 50MP e generosa batteria da 6000mAh con ricarica rapida a 45W. Si posiziona come alternativa accessibile nella gamma Reno14, proponendo un design curato e tutto quello che serve per un uso senza troppe preoccupazioni.
Destiny Rising: quando un gioco mobile supera il gioco originale
Destiny Rising: quando un gioco mobile supera il gioco originale
Tra il declino di Destiny 2 e la crisi di Bungie, il nuovo titolo mobile sviluppato da NetEase sorprende per profondità e varietà. Rising offre ciò che il live service di Bungie non riesce più a garantire, riportando i giocatori in un universo coerente. Un confronto che mette in luce i limiti tecnici e strategici dello studio di Bellevue
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


Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni Nokia Innovation Day 2025: l’Europa ha bisogno d...
Sottile, leggero e dall'autonomia WOW: OPPO Reno14 F conquista con stile e sostanza Sottile, leggero e dall'autonomia WOW: OPPO Reno...
Destiny Rising: quando un gioco mobile supera il gioco originale Destiny Rising: quando un gioco mobile supera il...
Plaud Note Pro convince per qualità e integrazione, ma l’abbonamento resta un ostacolo Plaud Note Pro convince per qualità e int...
Google Pixel 10 è compatto e ha uno zoom 5x a 899€: basta per essere un best-buy? Google Pixel 10 è compatto e ha uno zoom ...
Ancora controlli sulle e-bike, a Civitan...
Annunciato accidentalmente il nuovo gioc...
Spese militari da record: il conto nasco...
Intel e NVIDIA uniscono le forze: cos&ig...
Silent Hill f raccoglie ottimi voti su F...
L'industria farmaceutica americana si af...
Xiaomi YU7 GT avvistato al Nurburgring: ...
Intelligenza artificiale, agenti e strum...
Blocco note porta l'AI gratis sui PC, e ...
Arkheron, il nuovo gioco dell'ex lead de...
HONOR conferma Magic8: avrà AI na...
Auto volanti, il sogno si infrange: il p...
Cantieri in autostrada? Dal 2026 lo Stat...
Tesla non è molto trasparente su ...
Microsoft e NVIDIA guidano maxi-investim...
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: 13:52.


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