std::string als Rückgabewert per Referenz o. Pointer

Hallo zusammen,

ich habe hier einmal eine kleine Beispielklasse aufgeführt. Dieser Klasse sollen
Daten hinzugefügt und auch wieder abgerufen werden können. Beim Abrufen der
Daten möchte ich gerne eine std::string Referenz zurückgeben damit die Daten
nicht unnötig kopiert werden.

Was aber soll ich zurückgeben wenn der Index für die Daten nicht stimmt.
Wenn ich einen std::string Pointer zurückgeben würde könnte das einfach NULL
sein. Aber was bei einer Referenz ?


Code:
class Buffer
{

public:

...

   std::string& GetElement( size_t BufferElement ) const
   {
      if( BufferElement  < m_DataBuffer.size() )
         return m_DataBuffer[BufferElement];
      else
         ?
   }

pivate:

   std::vector< std::string > m_DataBuffer;

};
 
Hallo,

also spontan wuerde ich sagen das du 3 Moeglichkeiten hast.

1.) Du gibst den kompletten vector als konstante Referenze zurueck, also eine
Funktion ala:
Code:
const std::vector& GetDataBuffer() const;
(meiner Meinung nach die sauberste Loesung)

oder

2.) Du speicherst ein Element mehr (sprich am Anfang des Vectors) das den Eintrag
"invalid" hat. Und wenn dann BufferElement >= (m_DataBuffer.size() - 1) ist gibst du
m_DataBuffer[0] zurueck ansonsten m_DataBuffer[BufferElement + 1].

3.) Du wirfst eine Exception...

Gruß

RedWing
 
Was hälst du von der Lösung:

Code:
bool GetElement( size_t BufferElement, std::string& RetBuffer )
{
   if( BufferElement >= m_DataBuffer.size() )
      return -1;

   RetBuffer = m_DataBuffer[BufferElement];
   
   return 0;      
}
 
Ja kann man auch machen.
Allerdings wenn du schon einen bool zurueck gibst, dann sag doch:

Code:
bool GetElement( size_t BufferElement, std::string& RetBuffer )
{
   if( BufferElement >= m_DataBuffer.size() )
      return false;

   RetBuffer = m_DataBuffer[BufferElement];
   
   return true;      
}

Gruß

RedWing
 
Hallo!

Also ich wuerde da eher eine Exception werfen und ansonsten den Feldwert an dem angegebenen Feldindex zurueckgeben. Objekte als Parameter per Referenz hineinzureichen kann oftmals zu unvorhersehbaren Effekten fuehren.

Gruss Tom
 
Hallo,

Also ich wuerde da eher eine Exception werfen und ansonsten den Feldwert an dem angegebenen Feldindex zurueckgeben.

Da stimm ich dir zu. Allerdings ist blackbirdthefirsts Methode auch eine Moeglichkeit, ich kann da keine
Nebeneffekte erkennen.
Auch im Allgemeinen sehe ich keine Nebeneffekte bei der Verwendung von Referenzen als Parameter, wenn man
das sauber implementiert.

Gruß

RedWing
 
Zurück