2010-03-21 4 views
1

_stuckVertices est un tableau de pointeurs et je voudrais mettre à jour un index de ce tableau sans utiliser _stuckVertices[ (row * _cols) + column ] 3 fois. La raison pour laquelle c'est un tableau de pointeurs est parce que la grande majorité du temps le pointeur sera NULL. Le code fonctionne suivant mais je dois déréférencer un chaque fois que je l'utilise:C++ Pointer Problème

void Cloth::stickPoint(int column, int row) 
{ 
    Anchor **a = &_stuckVertices[ (row * _cols) + column ]; 
    if (!*a) 
     *a = new Anchor(this, column, row); 
    (*a)->stick(); 
} 

je l'avais à l'origine, il écrit comme cela, mais le pointeur _stuckVertices ne soit pas mis à jour:

void Cloth::stickPoint(int column, int row) 

    { 
     Anchor *a = _stuckVertices[ (row * _cols) + column ]; 
     if (!a) 
      a = new Anchor(this, column, row); 
     a->stick(); 
    } 

est-il un moyen d'écrire Anchor *a = _stuckVertices[ index ] de sorte que a est comme un alias dans le tableau que je peux mettre à jour, ou est quelque chose comme le premier morceau de code comment je devrais faire cela?

Merci

Répondre

4

Les références sont ce que vous cherchez - ils sont des alias:

Anchor*& a = _stuckVertices[ (row * _cols) + column ]; 
if (!a) 
    a = new Anchor(this, column, row); 
a->stick(); 
+0

Vous répondez à une autre de mes questions, merci :) En C utiliserait ** et déréférencer partout être la seule option? – Winder

+1

* Deuxième tentative, je dois apprendre à lire;) * Oui, malheureusement en C il n'y a pas de vrais alias. –

+1

Vous pouvez utiliser une macro en C, '#define a (_stuckVertices [(row * _cols) + colnum])', vous devez juste faire attention avec (vous devez également faire attention à la référence, mais pour des raisons légèrement différentes et de différentes manières). –

-1

_stuckVertices est un tableau de pointeurs

Que voulez-vous dire par là? Est-ce que oyu l'a créé comme ceci: Anchor * _stuckVertices = new Anchor [Number]; ou comme ceci: Anchor * _stuckVertices [Number] = {0}; ?

En premier cas, vous devriez être en mesure de le faire:

Anchor *a = _stuckVertices +((row * _cols) + column); 
a->stick(); 

En second cas:

Anchor *a = _stuckVertices[((row * _cols) + column)]; 
a->stick(); 

Et juste un soupçon, (ligne * _cols) + colonne pourrait être plus grand alors tableau -length Vous devez au moins ajouter une assertion avant d'accéder _stuckVertices par exemple:

#include <cassert> 
assert (sizeof(_stuckVertices)/sizeof(_stuckVertices[0]) > ((row * _cols) + column)); 

Cordialement, Valentin Heinitz

+0

Vous ignorez l'affectation de la nouvelle instance dans les deux cas, ce qui est le vrai problème. –