Errori, bug, domande - pagina 2356
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
in C++: A::f()
Cosa dice questo codice?
Cosa dice questo codice?
È lo stesso.
La stessa cosa.
Quello e MQL (supponendo che sia convertito in forma C++). Ma avresti potuto controllare tu stesso
Controllato:
Controllato:
Credo che stiate controllando qualcosa di sbagliato.
Una tale voce in MQL significa copiare un oggetto a - in un oggetto localizzato dal puntatore b1. In generale, ovviamente, non dovrebbe compilare.
E per non confondere oggetti e puntatori, è meglio usare il prefisso p per i puntatori
Controllato:
Per favore, non fatevi abbindolare da questo comportamento sbagliato.
Ci sono 2 problemi qui(?):
la virtuale B::f() non è sovraccaricata, quindi invece di una chiamata virtuale era una semplice chiamata, non c'è indirizzamento ai membri in B::f(), quindi anche l'accesso tramite "puntatore" è stato eliminato
Nel secondo caso, A::f() è una chiamata virtuale tentata, c'è un accesso tramite "puntatore", ma nessun oggetto a1, perché un costruttore di copia vuoto A::A(const A &) è stato chiamato anche per A *a1=b
Per favore, non fate affidamento su questo comportamento sbagliato.
Ci sono 2 problemi qui(?):
Spero che sistemerete questo comportamento errato? (fare un errore di compilazione) Perché è possibile fare un tale errore per caso e il compilatore non reagisce in alcun modo.
Spero che sistemerete questo comportamento errato? Perché è possibile fare un errore del genere per sbaglio e il compilatore non reagisce in alcun modo.
Sì, lo sistemeremo.
La priorità è impostata bassa perché solo le classi vuote ottengono codice funzionante
Per favore, non fate affidamento su questo comportamento sbagliato.
Ci sono 2 problemi qui(?):
la virtuale B::f() non è sovraccaricata, quindi invece di una chiamata virtuale era una semplice chiamata, non c'è indirizzamento ai membri in B::f(), quindi anche l'accesso tramite "puntatore" è stato eliminato
Nel secondo caso, A::f() è una chiamata virtuale tentata, c'è un accesso tramite "puntatore", ma nessun oggetto a1, perché un costruttore di copia vuoto A::A(const A &) è stato chiamato anche per A *a1=b
Grazie per la risposta dettagliata, tuttavia, sono un po' confuso sulla logica.
1) Perché il compilatore vede il costrutto B* b1=a come una chiamata all'operatore di copia A::A(const A&), (invece di chiamare B::B(const A&), perché è la classe B a sinistra dell'operatore=)
2) Perché il compilatore non ha generato l'avviso "copy constructor missing"?
3) perché una chiamata di metodo "semplice" è permessa per oggetti non esistenti (mentre un tentativo di chiamare direttamente B::f() dà un errore di compilazione "non è una chiamata di metodo statico")
4) E perché il compilatore permette una "semplice" chiamata di metodo virtuale? A mio parere, la virtualità non dovrebbe dipendere dalla presenza o assenza di dati nell'oggetto
1) Perché il compilatore vede B* b1=a come una chiamata all'operatore di copia A::A(const A&), (invece di chiamare B::B(const A&), perché è la classe B a sinistra di operator=)
Questo è esattamente vero. Questo è un altro bug di MQL, che il compilatore permette liberamente cose come: B b = a; Questa è una violazione dei principi di incapsulamento. In C++ queste cose non si compilano naturalmente, è necessaria una conversione esplicita. E nelle vecchie build di MQL queste cose non potevano essere fatte altrettanto bene.