2010-02-25 21 views
5

tengo una clase que se parece aproximadamente así:C++ utilizando 'esto' como parámetro

class MeshClass 
{ 
public: 
    Anchor getAnchorPoint(x, y) 
    { 
     return Anchor(this, x, y); 
    } 
private: 
    points[x*y]; 
} 

Quiero hacer otra clase que representa un punto de "ancla" que puede obtener acceso a la malla y modificar el punto, como esto:

class Anchor 
{ 
public: 
    Anchor(&MeshClass, x, y) 
    moveAnchor(x, y); 
} 

el problema es cuando trato de hacer el Anchor en el MeshClass::getAnchorPoint método, algo así como return Anchor(this, x, y) sino porque es this const no puedo. Como una solución alternativa hasta que entienda esto, tengo Anchor aceptando una referencia al punto y moveAnchor mueve el punto directamente.

Editar: Probablemente el problema fue algo estúpido que estaba haciendo al tratar de usar una referencia. Cambié a usar un puntero como lo haría normalmente y puedo pasar this sin quejas del compilador. Estoy casi seguro de que estaba obteniendo un error relacionado con la const, pero no puedo recrearlo así que debo estar loco.

+0

Hola, para mí el que no se supone que debe compilar ... lo hace? –

+1

Probablemente no (todavía) :) Tenga en cuenta que (al menos en la antigua C simple), si el tipo no se especifica, se establece de manera predeterminada en int, pero arroja una advertencia. –

+2

Publique el código real que desea utilizar y el error que genera. (No es cómo trataste de evitar ese error.) Actualmente es un poco difícil adivinar lo que intentas hacer. –

Respuesta

8

En C++, esto es un puntero, no una referencia. Se podría hacer algo como esto:

class Anchor; //forward declaration 

class MeshClass 
{ 
public: 
    Anchor getAnchorPoint(int x, int y) 
    { 
     return Anchor(*this, x, y); 
    } 
private: 
    int points[WIDTH*HEIGHT]; 
} 

class Anchor 
{ 
public: 
    Anchor(MeshClass &mc, int x, int y); 
} 
+0

Este fue probablemente mi problema. Decidí que Anchor aceptara un puntero en lugar de una referencia, en cuyo caso 'this' ahora parece funcionar bien como parámetro. – Winder

1

¿Por qué crees que this es const? this es un puntero, no una referencia. ¿No debería ser return Anchor(*this, x, y);?

+0

Técnicamente, esto en realidad _es_ const, * esto no es así. – Joel

+0

Técnicamente, 'this' no es const-qualified. No es modificable porque es un valor r, no porque sea const. Esto significa que 'this' tiene el tipo' Class * ', pero * not *' Class * const'. –

0

Podría cambiar de anclaje para aceptar un const MeshClass& como parámetro o fundido este como (MeshClass) al crear el ancla? No estoy seguro de si se puede usar const_cast<MeshClass>(this) para eliminar la constness de this.

2

El constness de este no es un problema. El puntero en sí es const, no el valor al que apunta.

Su problema real está aquí:

class MeshClass 
{ 
public: 
    Anchor getAnchorPoint(x, y) 
    { 
     return Anchor(*this, x, y); 
    } 
private: 
    points[x*y]; 
}