Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Qt Template su un tipo
Forum - C/C++ - Qt Template su un tipo

Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2309
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 16:00
Mercoledì, 11/10/2023
Salve ragazzi,
Sto cercando di creare un template paragonabile ad una lista generica,
Ma ho un errore quando provo ad inizializzare il costruttore o la lista stessa.

Quello che vorrei fare è avere una lista basata su questa classe

1) Classe Rectangle

Codice sorgente - presumibilmente C++

  1. #ifndef RECTANGLE_H
  2. #define RECTANGLE_H
  3.  
  4. class Rectangle
  5. {
  6. public:
  7.     int X;
  8.     int Y;
  9.     int Width;
  10.     int Height;
  11.  
  12.     Rectangle(int x,int y,int width,int height) : X(x),Y(y),Width(width),Height(height){}
  13.  
  14.     //Costruttore
  15.     Rectangle(const Rectangle& o)
  16.     {
  17.         X = o.X;
  18.         Y = o.Y;
  19.         Width = o.Width;
  20.         Height = o.Height;
  21.     }
  22.  
  23.     Rectangle& operator =(const Rectangle& o)
  24.     {
  25.         if(this != &other)
  26.         {
  27.             X = o.X;
  28.             Y = o.Y;
  29.             Width = o.Width;
  30.             Height = o.Height;
  31.         }
  32.         return *this;
  33.     }
  34.  
  35. };
  36.  
  37. #endif // RECTANGLE_H





2) Un Template di una lista generica

Codice sorgente - presumibilmente C++

  1. template <class T>
  2. class List {
  3. T values [100000];
  4.  
  5.  
  6. private:
  7.     int count = 0;
  8.   public:
  9.  
  10.  
  11.     void Add(T value)
  12.     {
  13.         values[count] = value;
  14.         count++;
  15.     }
  16.     int Count()
  17.     {
  18.         return count;
  19.     }
  20.  
  21.     T& operator [](int idx)
  22.     {
  23.         return values[idx];
  24.     }
  25.  
  26.     T& operator ++ (int idx)
  27.     {
  28.         values[idx]++;
  29.     }
  30.  
  31.     T& operator -- (int idx)
  32.     {
  33.         values[idx]--;
  34.     }
  35.  
  36.     bool Contains(T key)
  37.     {
  38.         for(int i = 0; i < sizeof(values); i++)
  39.         {
  40.             if(key == values[i])
  41.                 return true;
  42.  
  43.         }
  44.     }
  45. };




Nel codice esempio come provo a scrivere

Codice sorgente - presumibilmente C/C++

  1. List<Rectangle> *re = new List<Rectangle>;
  2.  
  3. //oppure
  4. List<Rectangle> re;



Ho un errore del genere:


error: no matching function for call to 'Rectangle::Rectangle()'

Aiuti su come posso risolvere?



https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6405
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 16:05
Giovedì, 12/10/2023
In effetti non esiste il costruttore

Rectangle()

senza argomenti. Mi sa che lo hai dimenticato.

P.S. la riga T values [100000]; non ha molto senso. Non devi allocare tanto spazio inutile nello stack. Devi usare un puntatore per strutture linkate.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2309
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 18:01
Giovedì, 12/10/2023
Grazie mille nessuno!

Ho risolto come mi hai suggerito.
Purtroppo sono abiutato a programmare in C#.
Solitamente anche se dichiari un costruttore diverso dalla classe (parametrizzato) funziona ugualmente.
Nel senso che non c'è bisogno di estendere il costrutto vuoto.

Pensavo che la stessa regola valesse per il C++ invece no.

Grazie ancora nessuno.

Riguardo al template, ho provato a dare un'aggiustatina come mi hai consigliato.

Tutto funziona perfettamente.

Codice sorgente - presumibilmente C++

  1. template <class T> class List {
  2. T* values;
  3.  
  4.  
  5. private:
  6.     int count = 0;
  7.     int size;
  8.     int capacity;
  9.  
  10.   public:
  11.     List() : size(0),capacity(10)
  12.     {
  13.         values = new T[capacity];
  14.     }
  15.  
  16.     ~List()
  17.     {
  18.         delete[] values;
  19.     }
  20.  
  21.     void Add(T value)
  22.     {
  23.         if(size == capacity)
  24.         {
  25.             capacity*=2;
  26.             T* new_values = new T[capacity];
  27.             for(int i = 0; i < size; i++)
  28.             {
  29.                 new_values[i] = values[i];
  30.             }
  31.             delete[] values;
  32.             values = new_values;
  33.         }
  34.  
  35.         values[size] = value;
  36.         size++;
  37.         count++;
  38.     }
  39.  
  40.  
  41.  
  42.     int Count() const
  43.     {
  44.         return count;
  45.     }
  46.  
  47.  
  48.     T& operator [](int idx)
  49.     {
  50.  
  51.         return values[idx];
  52.     }
  53.  
  54.     T& operator ++ (int idx)
  55.     {
  56.         values[idx]++;
  57.     }
  58.  
  59.     T& operator -- (int idx)
  60.     {
  61.         values[idx]--;
  62.     }
  63.  
  64.  
  65.     bool Contains(T key) const
  66.     {
  67.         for(int i = 0; i < sizeof(values); i++)
  68.         {
  69.             if(key == values[i])
  70.                 return true;
  71.  
  72.         }
  73.     }
  74.  
  75.     int getSize() const
  76.     {
  77.         return size;
  78.     }
  79. };



:ot: Piccola domanda
secondo tuo consiglio, è più opportuno aggiungere inline ad esempio al getSize o rimanere come sta?


Ultima modifica effettuata da Thejuster il 12/10/2023 alle 18:11


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6405
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 18:30
Giovedì, 12/10/2023
Va bene così


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2309
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 19:46
Giovedì, 12/10/2023
Ok grazie ancora nessuno.
Chiedevo giusto per informazione visto che si tratta di una libreria.

Ma ovviamente seguo i consigli di chi è più esperto di me.


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote