Io sono scomparsi alcune funzionalità importante dal std::complex
come la possibilità di aggiungere un std::complex<float>
e std::complex<double>
o operazioni quali 1+c
, cioè tra int
e std::complex
. La mia idea era di ricavare una nuova classe my::complex
da std::complex
che eredita solo tutto ciò che è già implementato e aggiunge altre cose.Esiste un buon modo per estendere una classe con operatori aggiuntivi?
Per rendere il codice compatibile con le funzioni utilizzando std::complex
, ho aggiunto conversione automatica da e std::complex
(e anche conversioni automatiche tra my::complex<float>
e my::complex<double>
).
Ora qualcosa come
my::complex<float> c1,c2,c3;
c1 = c2 + c3;
funziona anche se non ha attuato operator+
me stesso, dal momento che c2
e c3
sono espressi a std::complex
, ha aggiunto e il risultato viene gettato di nuovo a my::complex
. Suppongo che il compilatore possa ottimizzare qualsiasi copia effettiva.
Tuttavia, il seguente non funziona:
c1 = 2*(c2+c3)
poiché std::complex
non può essere moltiplicato per un numero intero (stesso problema se moltiplicare per un letto e hanno complex<float>
s).
ho pensato "ok, sembra che devo aggiungere operator+
dopo tutto", ma se lo faccio, io ottenere use of overloaded operator '+' is ambiguous
dal momento che il compilatore può tra std::complex
e my::complex
implicitamente.
C'è un modo migliore per ottenere ciò che voglio o devo completamente reimplementare tutto in std::complex
e buttare via l'ereditarietà?
sicuro, ma hai provato 'c1 = (c2 + c3) * 2'? – user463035818
non sono sicuro, ma per aggiungere 'std :: complex' a 'std :: complex ' Penso che non sia necessaria l'ereditarietà, ma è possibile implementare l'operatore come funzione libera –
user463035818
La conversione di tipo automatico è la peggiore, la maggior parte pericolosa disfunzione di C++, ecco perché i costruttori di conversione sono 'espliciti' in' std :: complex'. Nuota contro corrente a tuo rischio. –