std::list NullReferenceException

dertobian

Mitglied
Hallo,

ich habe eine Liste deklariert:

Code:
list<LexValue *> registry;

und bekomme an der Stelle eine NullReferenceException:

Code:
this->registry.push_back(object);

Wie bekomme ich diese Exception weg? Also mit new list() hab ich´s auch nicht hinbekommen:

Fehler 1 error C2955: "std::list": Für die Verwendung der template-Klasse ist eine template-Argumentliste erforderlich.

Wie würde das hier richtig aussehen?



Gruß Tobian.
 
Sieht nicht direkt falsch aus. Aber zu prüfen wäre:

Ist this gültig (Ernsthaft, in C++ ist ein this mit NULL durchaus möglich)


Für new müßte das so gehen:
pRregistry = new std::list<LexValue*>();

Nicht das delete vergessen!
 
Danke für die Antwort! Aber das funktioniert leider auch nicht:

Fehler 1 error C2679: Binärer Operator '=': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'std::list<_Ty> *' akzeptiert (oder keine geeignete Konvertierung möglich)

Was sagt mir das?


Gruß Tobian.
 
Aber wenn ich eine Liste

Code:
list<LexValue *> registry;

erstelle, dann ist die Antwort von Endurion doch theoretisch richtig? Aber praktisch nicht...


Gruß Tobian.
 
Ja, stimmt. Das sieht gut aus. Ich musste aus

Code:
this->registry.push_back(object);

das hier

Code:
this->registry->push_back(object);

machen und konnte dann wieder kompilieren.

Aber die NullReferenceException kommt immernoch. Ich verstehs nich...


Gruß Tobian.
 
Hi.

Wie Endurion bereits angesprochen hat, wäre zu prüfen ob der this Zeiger null ist.

Dazu müßtest du mal mehr Code posten. Wie du die einzelnen Objekte erstellst.

Gruß
 
Ja, ich habe mal nachgeschaut und bekomme tatsächlich beim Überwachen die Meldung

Fehler: Der Bezeichner "registry" liegt außerhalb des gültigen Bereichs.

Ok, ich poste einfach mal den Code.

lexvaluefactory.h
Code:
//
// lexvaluefactory
//
#pragma once

class LexValueFactory
{
public:
  static LexValueFactory *
  getInstance();
  virtual
  ~LexValueFactory();

  LexValue *
  createLexValue();
  LexValue *
  createLexValue( char * str, char cTok, int line, int col );
  LexValue *
  createLexValue( char * str, int  iTok, int line, int col );

  LexValueFactory();
  void
  registerObject( LexValue * newInstance );

private:
  void
  deleteCreatedObjects();

  static LexValueFactory *       instance;
  list<LexValue *>             * registry;
};

lexvaluefactory.cpp
Code:
#include "stdafx.h"

// default constructor
LexValueFactory::LexValueFactory()
{
}

// default destructor
LexValueFactory::~LexValueFactory()
{
  deleteCreatedObjects();
}

LexValueFactory *
LexValueFactory::instance = 0;

LexValueFactory *
LexValueFactory::getInstance()
{
  if( instance == 0 )
  {
    instance = new LexValueFactory;
  }
  return ( instance );
}

LexValue *
LexValueFactory::createLexValue()
{
  LexValue * newLexValue = new LexValue();
  registerObject   ( newLexValue );
  return           ( newLexValue );
}

LexValue *
LexValueFactory::createLexValue( char * str,  char cTok,
				   int    line, int  col  )
{
  LexValue * newLexValue = new LexValue( str, cTok, line, col );
  registerObject   ( newLexValue );
  return           ( newLexValue );
}

LexValue *
LexValueFactory::createLexValue( char * str,  int iTok,
				   int    line, int col  )
{
  LexValue * newLexValue = new LexValue( str, iTok, line, col );
  registerObject   ( newLexValue );
  return           ( newLexValue );
}

void
LexValueFactory::registerObject( LexValue * newInstance )
{
	registry->push_back( newInstance ); // hier kommt dann die Exception, egal ob mit oder ohne this->
}

void
LexValueFactory::deleteCreatedObjects()
{
  list<LexValue *>::iterator i;
  for( i  = registry->begin() ;
       i != registry->end()   ;
       i++                    )
  {
    delete ( *i );
  }
  registry->clear();
}

Aufgerufen wird das Ganze so:
Code:
lex_value_factory = LexValueFactory::getInstance();
(Ich bin auch schon den Weg über new gegangen, is egal)

lex_value_factory ist in der stdafx.h definiert:
Code:
static LexValueFactory *lex_value_factory = 0;

Nicht über die LexValueFactory an sich wundern, die muss ich so (oder ähnlich) verwenden.

Gruß Tobian.
 
Hi.

Ich sehe nirgendwo die Stelle wo Speicher für registry erzeugt wird.

Der Konstruktor wäre eine gute Stelle dafür. Obwohl dieser eher als private deklariert sein sollte.

Gruß
 
Zurück