Sto provando a progettare classi di gerarchia che estendono i tipi C interi. Quello che sto cercando di ottenere è fondamentalmente il seguente:
Ho una classe base chiamata Integer
questa classe è una classe astratta, l'unica cosa che vorrei fornire è fondamentalmente le operazioni di base tra interi, ovvero +,-,*,/,&,^,|,~,etc if I'm missing something
, solo l'interfaccia nessuna implementazione. Quindi eseguirò una sottoclasse di tale classe con StaticInteger
e DynamicInteger
la differenza è che StaticInteger
utilizza i modelli per descrivere la dimensione del tipo in fase di compilazione, mentre DynamicInteger
la dimensione può essere modificata in fase di esecuzione.
Alcuni casi d'uso sarebbero i seguenti per entrambe le classi:
StaticInteger<14> is1 = 3;
StaticInteger<32> is2 = 15;
StaticInteger<16> is3 = is1 + is2;
DynamicInteger id1;
id1.setWidth(14);
id1.setWidth(16);
id1 = is1;
Internamente i dati sono rappresentati usando gli array, quindi per esempio il ridimensionamento nel tipo dinamico verrebbe ottenuto usando new/delete
operatori;
Fondamentalmente ciò che mi lascia perplesso è come progettare correttamente l'interfaccia della classe astratta base Integer. Diciamo che progetterei direttamente la classe StaticInteger che dovrei provare a fare qualcosa del tipo:
template <int L>
class StaticInteger {
public:
//bla bla
template <int M>
StaticInteger<L> operator+(StaticInteger<M> x);
private:
//bla bla
};
La dinamica sarebbe invece
class DynamicInteger {
public:
DynamicInteger operator+(DynamicInteger x);
private:
};
ma come dovrei specificare l'interfaccia che coprirebbe ogni possibile interfaccia di tale operatore? Tra statico e dinamico penso sia chiaro che in generale per un dato operatore l'implementazione dell'algoritmo potrebbe essere diversa.
Solo un'ulteriore nota, capisco che c'è probabilmente un problema filosofico dietro ciò che sto cercando di fare, dal momento che un operatore è in realtà una funzione in C ++, e per essere definito correttamente richiede tutti i tipi specificati a priori, in la classe base.
Aggiornamento: solo un design alternativo, stavo pensando che forse avrei potuto astrarre il concetto di operazioni usando una classe separata (come un modello di strategia).