In linguaggi dinamicamente tipizzati come JavaScript o PHP, faccio spesso funzioni quali:Restituisce un "riferimento NULL" in C++?
function getSomething(name) {
if (content_[name]) return content_[name];
return null; // doesn't exist
}
mi restituiscono un oggetto se esiste o se non null
.
Quale sarebbe l'equivalente in C++ utilizzando i riferimenti? C'è qualche schema consigliato in generale? Ho visto alcuni quadri che hanno un metodo di isNull()
per questo scopo:
SomeResource SomeClass::getSomething(std::string name) {
if (content_.find(name) != content_.end()) return content_[name];
SomeResource output; // Create a "null" resource
return output;
}
Poi il chiamante controllerebbe la risorsa in questo modo:
SomeResource r = obj.getSomething("something");
if (!r.isNull()) {
// OK
} else {
// NOT OK
}
Tuttavia, avendo per implementare questo tipo di metodo magico per ogni classe sembra pesante. Inoltre, non sembra ovvio quando lo stato interno dell'oggetto deve essere impostato da "null" a "not null".
C'è qualche alternativa a questo schema? So già che si può fare usando i puntatori, ma mi chiedo come/se può essere fatto con riferimenti. O dovrei rinunciare a restituire oggetti "null" in C++ e usare un modello specifico per C++? Qualsiasi suggerimento sul modo corretto di farlo sarebbe apprezzato.
"Oltre a utilizzare i puntatori" esclude i puntatori intelligenti? – hmjd
Il ritorno degli iteratori è uno schema che si presenta abbastanza spesso. Si restituisce un iteratore non valido se la cosa non è stata trovata. – Mat
Bene i tuoi suggerimenti 'isNull()' non è tipico C++. Qual è il vero problema che stai cercando di risolvere. Forse possiamo fornire idee migliori se capiamo cosa stai cercando di fare. –