View Full Version : Vector inizializzato nel costruttore risulta vuoto subito dopo.
Questa è la classe dichiarata nel .h:
class TOH_Node
{
public:
//a tower is represented by a stack of integers
typedef std::stack<int> Tower;
private:
...variabili e metodi omessi...
//the three towers representing this state
std::vector<Tower> towers;
public:
//--------CTORS
TOH_Node()
{
towers.push_back(Tower());
towers.push_back(Tower());
towers.push_back(Tower());
}
TOH_Node(bool p_IsInitialNode) : bIsInitialNode(p_IsInitialNode){TOH_Node();SetInitialState();}
~TOH_Node(){}
//------------
...metodi omessi...
};
Nel costruttore con parametro richiamo il costruttore di base e poi la SetInitialState(). Vengono richiamati correttamente, ho verificato con dei cout. Inoltre con un breakpoint nel costruttore senza parametro ho visto che 'towers' ha size 3 dopo i push_back.
Il problema è che poi richiama la SetInitialState che mi fa dei push. Ad esempio:
towers[towerIndex].push(3);
e mi crasha perchè dice che l'indice che uso sul vector è andato out of range. towerIndex vale 0 quando il programma crasha, ma il problema non è lui, il problema è che towers ha size 0 dentro la funzione che richiamo.
L'ordine di esecuzione delle operazioni è corretto e l'ho controllato facendo debug, prima inizializza il vettore towers, poi richiama il metodo per ci mette dentro i valori.
Ho notato che il problema si presenta solo se inizializzo un oggetto della classe TOH_Node con il costruttore con parametro, se lo inizializzo con il costruttore base non ci sono problemi.
vendettaaaaa
15-07-2013, 13:08
Questa è la classe dichiarata nel .h:
class TOH_Node
{
public:
//a tower is represented by a stack of integers
typedef std::stack<int> Tower;
private:
...variabili e metodi omessi...
//the three towers representing this state
std::vector<Tower> towers;
public:
//--------CTORS
TOH_Node()
{
towers.push_back(Tower());
towers.push_back(Tower());
towers.push_back(Tower());
}
TOH_Node(bool p_IsInitialNode) : bIsInitialNode(p_IsInitialNode){TOH_Node();SetInitialState();}
~TOH_Node(){}
//------------
...metodi omessi...
};
Nel costruttore con parametro richiamo il costruttore di base e poi la SetInitialState(). Vengono richiamati correttamente, ho verificato con dei cout. Inoltre con un breakpoint nel costruttore senza parametro ho visto che 'towers' ha size 3 dopo i push_back.
Il problema è che poi richiama la SetInitialState che mi fa dei push. Ad esempio:
towers[towerIndex].push(3);
e mi crasha perchè dice che l'indice che uso sul vector è andato out of range. towerIndex vale 0 quando il programma crasha, ma il problema non è lui, il problema è che towers ha size 0 dentro la funzione che richiamo.
L'ordine di esecuzione delle operazioni è corretto e l'ho controllato facendo debug, prima inizializza il vettore towers, poi richiama il metodo per ci mette dentro i valori.
TOH_Node(bool p_IsInitialNode) : bIsInitialNode(p_IsInitialNode)
{
TOH_Node();
SetInitialState();
}
Errore: stai creando un oggetto anonimo di tipo TOH_Node, non stai invocando il costruttore.
E' come scrivere
vector<int>();
Crei un oggetto senza assegnarlo ad alcuna variabile.
Per invocare il costruttore di default, dentro ad un qualsiasi altro costruttore della classe, devi scrivere così:
this->TOH_Node::TOH_Node();
Anche senza il this, ma così è più chiaro che stai invocando TOH_Node, nella classe TOH_Node, sull'oggetto corrente.
Grazie! Ero arrivato a capire che stavo ridichiarando un oggetto con quella chiamata ma non sapevo come e se si potesse richiamare il costruttore di base.
Adesso funziona:D .
Ho un altro problema ma non volevo aprire un thread a parte perchè probabilmente è una stupidaggine quindi provo a scrivere qua.
Voglio fare overload dell'operatore == per gli oggetti della classe che ho definito nel primo post.
Voglio che l'overload sia nei due casi:
chiamo == tra due copie di variabili di quel tipo oppure chiamo == tra due puntatori a variabili di quel tipo.
Quello che ho fatto è:
//operator overloading (passing value)
bool operator==(TOH_Node node);
//operator overloading (passing pointer)
bool operator==(TOH_Node *node);
Mentre il primo funziona, per esempio if( *node1 == *node2 ) mi richiama il primo overload operator==(TOH_Node node), il secondo no.
Io pensavo (evidentemente malissimo) che richiamando if( node1 == node2 ) mi dovesse richiamare il secondo overload che ho fatto.
Ho provato a cambiare diverse cose sia nella chiamata che nella definizione del metodo ma non ho trovato nemmeno un modo perchè lo richiami.
vendettaaaaa
15-07-2013, 18:30
Ho un altro problema ma non volevo aprire un thread a parte perchè probabilmente è una stupidaggine quindi provo a scrivere qua.
Voglio fare overload dell'operatore == per gli oggetti della classe che ho definito nel primo post.
Voglio che l'overload sia nei due casi:
chiamo == tra due copie di variabili di quel tipo oppure chiamo == tra due puntatori a variabili di quel tipo.
Quello che ho fatto è:
//operator overloading (passing value)
bool operator==(TOH_Node node);
//operator overloading (passing pointer)
bool operator==(TOH_Node *node);
Mentre il primo funziona, per esempio if( *node1 == *node2 ) mi richiama il primo overload operator==(TOH_Node node), il secondo no.
Io pensavo (evidentemente malissimo) che richiamando if( node1 == node2 ) mi dovesse richiamare il secondo overload che ho fatto.
Ho provato a cambiare diverse cose sia nella chiamata che nella definizione del metodo ma non ho trovato nemmeno un modo perchè lo richiami.
operator== è un operatore binario, ma nella lista parametri gli passi un solo argomento. Secondo te l'altro quale potrebbe essere?
operator== è un operatore binario, ma nella lista parametri gli passi un solo argomento. Secondo te l'altro quale potrebbe essere?
Nuooooooooooooooooo...
questo funziona:
if( *node1 == node2 )
Non so perchè mi ero convinto di dover cambiare anche la prima variabile:doh: .
Però comunque non capisco se esista il modo per poter fare override di == in modo che richiami la mia funzione quando confronto:
if( node1 == node2 )
questo non sono riuscito a farlo.
vendettaaaaa
15-07-2013, 20:46
Nuooooooooooooooooo...
questo funziona:
if( *node1 == node2 )
Non so perchè mi ero convinto di dover cambiare anche la prima variabile:doh: .
Però comunque non capisco se esista il modo per poter fare override di == in modo che richiami la mia funzione quando confronto:
if( node1 == node2 )
questo non sono riuscito a farlo.
Semplicemente, non deve essere una funzione membro :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.