Const- Iterator für eigene Klasse

little-smile

Grünschnabel
Hallo Ihr Lieben,

Ich hab folgende Klassen:

Code:
class GramInfo
{
	public:
		/*Constructor and Destructor*/
		GramInfo();
		GramInfo( const unsigned int& hash, const unsigned int& pos);
		virtual ~GramInfo();	
	
		/*further member functions*/
		void setHashValue(const unsigned int& hash){GramHashValue = hash;}
		void setGramStartPos(const unsigned int& pos){GramStartPos = pos;}
		
		const unsigned int& getGramHashValue()const{return GramHashValue;}
		const unsigned int& getGramStartPos(){return GramStartPos;}
		

	private:
		unsigned int GramHashValue;
		unsigned int GramStartPos;
	
};


class GramTable : public vector<GramInfo*>
{
		GramTable(){}
	  	virtual ~GramTable(){}

  		void addGram(const unsigned int& hash, const unsigned int& pos) 
  		{ 
  			GramInfo* info = new GramInfo(hash, pos );
  			push_back( info ); 
  		} 
};

Für die zweite Klasse hätte ich gerne einen Const_iterator, um auch den Iterator an eine Funktion übergeben zu können.
Also muss ich ja irgendwie in die class GramTable einen Iterator deklarieren. Da dies total neu für mich ist und die Zeit mir davon läuft, würde ich euch um ein paar Tipps bitten.

thx, little-smile
 
Hi.

Das es grundsätzlich eine schlechte Idee ist eine Klasse von einem STL Container abzuleiten hatten wir ja schon geklärt. Warum willst du denn an diesem Konstrukt trotzdem festhalten?

Der Nutzen der zusätzlichen Methode ist doch äußerst zweifelhaft.
C++:
typedef vector<GramInfo*> GramTable;
Gruß
 
Sorry, aber ich habe gerade keine andere Idee, wie ich es sonst machen kann!

Und was meist du mit deiner Äußerung, dass du den Nutzen einer zusätzlichen Mathode zweifelhaft findest!

Sorry, dass ich mich da so doof anstelle!


Gruss
little-smile
 
Meinst du damit, dass ich meine Klasse GramTable komplett weglassen soll und stattdessen folgendes schreiben soll?:

Code:
typedef vector<GramInfo*> GramTable;

Ich nehme mal an, dass du es so meinst! Du wolltest mir sagen, dass es überflüssig ist die Klasse GramTable zu deklarieren, weil auch die Methode nur eine "Umbenennung" der Methode push_back im STL Vector darstellt.

ALso wenn du es so meintest, dann habe ich es wohl verstanden!

Gruss
little-smile
 
Zuletzt bearbeitet:
Und was meist du mit deiner Äußerung, dass du den Nutzen einer zusätzlichen Mathode zweifelhaft findest!
Naja, was bringt dir denn diese zusätzliche Methode?

Man kann damit einen Eintrag in einem Vektor hinzufügen. Das Gleiche erreicht man aber auch mit push_back. Nur für den "Komfort" weniger Schreibarbeit (?) diese Büchse der Pandoro zu öffnen ist zweifelhaft.

Wozu willst du denn unbedingt eine eigene Klasse erstellen? Warum reicht denn nicht der typedef?

Gruß

PS: Was ist denn eigentlich mit dem anderen Problem? Hast du das jetzt durch die Verwendung der Zeiger umgangen?
 
Zuletzt bearbeitet:
Das andere Problem hat sich teilweise gelöst. Also zumindest mit dem Ende, da hattest du schon Recht, dass es nicht verwunderlich ist, weil end() ja nicht aufs letzte Element zeigt!

Ansonsten ist es erstmal auf Eis gelegt!

Gut ich hätte da mal eine andere Frage. Nachdem ich meine Class geext habe und typedef verwende.

Ich übergebe meine GramTable dann immer als Pointer. Nun habe ich aber das Problem, dass ich mein folgender Vergleich meckert:

Code:
GramTable* rep_grams;
GramTable* subj_grams;

GramTable::const_iterator rep_pos, subj_pos;

((*rep_grams)[*rep_pos] != (*subj_grams)[*subj_pos])

bzw. habe ich es auch mit at probiert, das gleiche

Code:
(*prep_grams).at(*rep_pos) != (*psubj_grams).at(*subj_pos)

Was mache ich da falsch?

Die Fehlermeldung lautet:
Multiple markers at this line
-Fehler: ungültige Umwandlung von »GramInfo* const« in »unsigned int
«
-Fehler: Argument 1 von »typename std::_Vector_base<_Tp, _Alloc>::
_Tp_alloc_type::reference std::vector<_Tp, _Alloc>::at(size_t) [with _Tp =
GramInfo*, _Alloc = std::allocator<GramInfo*>]« wird initialisiert
-Fehler: Die Übergabe von »const GramTable« als »this«-Argument von
»typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::reference std::
vector<_Tp, _Alloc>::at(size_t) [with _Tp = GramInfo*, _Alloc = std::
allocator<GramInfo*>]« streicht Qualifizierer


Wäre sehr dankbar, wenn du mir helfen könntest!

little-smile
 
C++:
class GramInfo
{
	unsigned int m_HashValue;
	unsigned int m_StartPosition;

public:
	explizit GramInfo(const unsigned int hash = 0, const unsigned int position = 0)
		: m_HashValue(hash), m_StartPosition(position)
	{}
	virtual ~GramInfo() {}	
	
public:
	void setHashValue(const unsigned int hash) { m_HashValue = hash; }
	void setStartPos(const unsigned int position) { m_StartPosition = position;}

public:
	const unsigned int getHashValue() const { return m_HashValue; }
	const unsigned int getStartPos() const { return m_StartPosition; }
};

typedef std::vector<GramInfo> GramTable;
 
Zurück