PDA

View Full Version : Vector inizializzato nel costruttore risulta vuoto subito dopo.


-Ivan-
15-07-2013, 11:24
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.

-Ivan-
15-07-2013, 13:05
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.

-Ivan-
15-07-2013, 13:55
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 .

-Ivan-
15-07-2013, 17:19
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?

-Ivan-
15-07-2013, 20:14
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 :)