PDA

View Full Version : [c++] Problema con classi template


dileoa
27-04-2022, 11:19
Ho progettato delle classi per gestire la cifratura a blocchi.
Le classi sono:

class DBlockCipher: una classe astratta che gestisce tutte le operazioni di cifratura indipendenti dallo specifico algoritmo;
template <class A, K> class DTBlockCipher: derivata da DBlockCipher , che utilizza l’algoritmo implementato dalla classe A e la relativa chiave implementata dalla classe K per effettuare la cifratura dei blocchi;
template <class A, K> class DTBlockCipherFile: derivata da DTBlockCipher specializzata per cifrare i file.

Ciascuna classe ha due costruttori:
DBlockCipher:

DBlockCipher(){ initialize();}
DBlockCipher(int NewMode){ initialize(); Mode = NewMode; }

DTBlockCipher:

DTBlockCipher(): DBlockCipher(){ initialize();}
DTBlockCipher(int NewMode): DBlockCipher(int NewMode){ initialize();}

DTBlockCipherFile:

DTBlockCipherFile(): DTBlockCipher(){ initialize();}
DTBlockCipherFile(int NewMode): DTBlockCipher(int NewMode){ initialize();}

Dove initialize() è una generica funzione che inizializza la classe e int Mode è il modo di cifratura a blocchi (ECB, CBC ecc.).
La riga di codice:
DTBlockCipherFile<DAESAlg, DAESKey> AES(CBC);
//DAESAlg classe che implementa AES
//DAESKey classe che implementa chiavi AES
//CBC è un valore numerico (1) per eseguire la modalità CBC
pensavo che desse luogo alla sequenza di chiamate dei costruttori:
DTBlockCipherFile(CBC) => DTBlockCipher(CBC) => DBlockCipher(CBC)
Invece la sequenza è:
DTBlockCipherFile(CBC) => DTBlockCipher(CBC) => DBlockCipher()
Cosa ho sbagliato? Potete aiutarmi?
Grazie.

-MiStO-
27-04-2022, 12:04
direi che questo può esserti d'aiuto
https://stackoverflow.com/questions/120876/what-are-the-rules-for-calling-the-base-class-constructor

in pratica, specifichi tu che ctor base chiamare nella lista di inizializzazione

DTBlockCipherFile(int mode):
DTBlockCipher(mode)
{
initialize();
Mode = mode;
}

e

DTBlockCipher(int mode):
DBlockCipher(mode)
{
initialize();
Mode = mode;
}

dileoa
02-05-2022, 12:46
Grazie per il suggerimento.
Ho risolto il problema chiamando il ctor interessato della classe base:

DTBlockCipherFile(NewMode): DTBlockCipher(), DBlockCipher(NewMode) {...}

ADL