Ich habe folgende Zuordnerklasse:Ist es ein Geruch, Dinge in einem Parameter zu sammeln, der als Referenz in C++ zurückgegeben wird?
class ObjectMapper {
public:
std::map<uint32_t, uint32_t>& getMappingForObject(
Object* object);
private:
std::unordered_map<Object*, std::map<uint32_t, uint32_t>> m_objMapping;
};
, deren Umsetzung so etwas wie dieses:
std::map<uint32_t, uint32_t>& ObjectMapper::getMappingForObject(
Object* object) {
const auto mappingTableIterator = m_objMapping.find(object);
if (mappingTableIterator == m_objMapping.end()) {
auto it = m_objMapping.emplace(object,
std::map<uint32_t, uint32_t>());
return it.first->second;
}
return mappingTableIterator->second;
}
diese So kann der Anrufer tun:
std::map<uint32_t, uint32_t>& mappingTable =
objMapper.getMappingForObject(object);
Und gehen Sie auf und fügen/Dinge entfernen in mappingTable
.
Ist das ein gutes Muster in C++? Ich glaube, dass dies einen Referenzausgangsparameter verwendet, um Besitz zu übergeben, was ein Geruch ist, aber ich bin mir nicht sicher. Gibt es eine Alternative, die schöner ist?
Ihr 'getMappingForObject' ist nur' operator [] 'für Maps ... –
Sie haben keinen Besitz übergeben, Ihre' unordered_map' hat nur einen rohen Zeiger. Sie haben keinen Ausgabeparameter. Ob etwas ein "Code-Geruch" ist, ist auch sehr eigensinnig. –
Was bedeutet es genau zu fragen "Ist es ein Geruch?" Vielleicht sollte der Titel weniger umgangssprachlich sein. –