所以我有这个问题,输出打印我的指针的地址,我不知道为什么会发生这种情况因为指针根本没有被修改
下面是代码:
using namespace std;
class AndroideAbstracto {
protected:
int *vida;
int *fuerza;
int *velocidad;
public:
void setvalores(int vi, int fu, int ve) {
velocidad = &ve;
vida = &vi;
fuerza = &fu;
};
virtual void imprimir(void) = 0;
};
class Androide : public AndroideAbstracto {
public:
void imprimir() {
std::cout << "Caracteristicas del androide:" << endl;
cout << "Velocidad = " << *velocidad << endl;
cout << "Vida = " << *vida << endl;
cout << "Fuerza = " << *fuerza << endl;
};
};
class Decorator : public AndroideAbstracto {
protected:
AndroideAbstracto *AndroideDec;
public:
Decorator(AndroideAbstracto* android_abs) {
AndroideDec = android_abs;
}
virtual void imprimir(void) = 0;
};
class Androide_Con_Habi : public Decorator {
protected:
string habilidad;
public:
Androide_Con_Habi(AndroideAbstracto* android_abs, string habi) : Decorator(android_abs) {
habilidad = habi;
}
virtual void imprimir() {
AndroideDec->imprimir();
cout << "La habilidad especial del androide es: " << habilidad << endl;
}
};
class Androide_Elegido : public Decorator {
protected:
bool elegido;
public:
Androide_Elegido(AndroideAbstracto *android_abs, bool es) : Decorator(android_abs) {
elegido = es;
}
virtual void imprimir() {
if (elegido) {
// *vida =(*vida) * 2; //Im quite new to C++ so im not really
// *fuerza *=2; //sure how should I multiply these pointers
// *velocidad *=2;
// AndroideDec->setvalores(vida*2,fuerza*2,velocidad*2);
AndroideDec->imprimir();
cout << "Este androide es uno de los elegidos";
}
}
};
int main(int argc, char *argv[]) {
Androide *andro = new Androide();
andro->setvalores(600, 700, 300);
andro->imprimir();
Androide_Con_Habi *andro_con_habi = new Androide_Con_Habi(andro, "Volar");
andro_con_habi->imprimir();
Androide_Elegido *superpoderoso = new Androide_Elegido(andro, true);
superpoderoso->imprimir();
delete superpoderoso;
delete andro;
delete andro_con_habi;
return 0;
}
我不知道为什么会打印出来:
Caracteristicas del androide:
Velocidad = 300
Vida = 600
Fuerza = 700
Caracteristicas del androide:
Velocidad = 300
Vida = 152436744
Fuerza = -1074718788
La habilidad especial del androide es: Volar
Caracteristicas del androide:
Velocidad = 300
Vida = 152436744
Fuerza = 1
Este androide es uno de los elegidos
答案 0 :(得分:3)
void setvalores(int vi, int fu, int ve) {
velocidad = &ve;
vida = &vi;
fuerza = &fu;
};
当函数返回时,指向vi
,fu
和ve
的指针无效。你没有看到地址被打印,只是垃圾。
您的整个设计不会也不应该使用指针。
答案 1 :(得分:0)
您所看到的是您的函数的形式参数的地址。基本无意义的值是无用的,并且基本上是指向堆栈上随机位置的指针 - 无论何时堆栈恰好是在您调用构造函数时。除非您试图了解有关计算机和编译器如何工作的更多信息,否则您基本上永远不会对这些值感兴趣。
了解指针的作用以及它们何时适用,以及它们的含义是非常重要的。
在这种情况下,它不适合使用指针,因为:
我怀疑这是你的意图:
class AndroideAbstracto {
protected:
int vida;
int fuerza;
int velocidad;
public:
void setvalores(int vi, int fu, int ve) {
velocidad = ve;
vida = vi;
fuerza = fu;
};
virtual void imprimir(void) = 0;
};
class Androide : public AndroideAbstracto {
public:
void imprimir() {
std::cout << "Caracteristicas del androide:" << endl;
cout << "Velocidad = " << velocidad << endl;
cout << "Vida = " << vida << endl;
cout << "Fuerza = " << fuerza << endl;
};
};
注意类成员的类型以及打印出值时缺少*。
一个不太好,但语法正确使用指针的方法是使用一次调用查询类中的多个值(放在任一类中):
void getvalores(int *vi, int *fu, int *ve) {
if (vi)
*vi = vida;
if (fu)
*fu = fuerza;
if (ve)
*ve = velocidad;
}
这样称呼,例如:
int vida, velocidad;
andro->getvalores(&vida, NULL, &velocidad);
cout << "Velocidad = " << velocidad << endl;
cout << "Vida = " << vida << endl;
这里我们已经将堆栈变量vida和velocidad的地址作为指针传递,并传递NULL,我们可以传递一个额外的地址,因为我们不想要fuerza的值。然后我们分配给传入指针所指向的内存,如果它们不是null,并且当函数返回时,堆栈变量具有类中的值。
当然,您不应该实际执行此操作 - 您应该以另一种方式提供对值的访问,可以直接通过公开它们,也可以添加仅返回它们的函数。
public:
int Vida() {
return vida;
}
然后你可以这样做:
cout << "Vida = " << andro->Vida() << endl;
当然,除非有理由使用堆来创建Androide实例,否则你应该使用堆栈内存而不是堆。
Androide andro;
而不是
Androide *andro = new Androide();