-2

所以我有这个问题,输出打印我的指针的地址,我不知道为什么会发生这种情况,因为指针根本没有修改

继承人的代码:

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 
4

2 回答 2

3
void setvalores(int vi, int fu, int ve) {
    velocidad = &ve;
    vida = &vi;
    fuerza = &fu;

};

指向 、 和 的指针vifu函数ve返回时失效。您没有看到正在打印的地址,而只是垃圾。

不过,您的整个设计不需要也不应该使用指针。

于 2012-03-31T03:51:51.433 回答
0

您看到的是函数形式参数的地址。本质上没有意义的值没有用,本质上是指向堆栈上随机位置的指针——当你调用构造函数时堆栈碰巧在哪里。除非您尝试更多地了解您的计算机和编译器的工作原理,否则您基本上永远不会对这些值感兴趣。

了解指针的作用以及它们何时适用以及它们的含义是非常重要的。

在这种情况下,不适合使用指针,因为:

  • 您正在尝试将数据存储在您的类中,并且您要存储的类型是:
    • 无论如何都与指针大小相同(int)
    • 没有理由将它的记忆保留在课堂之外(无论如何都没有显示)
    • 即使您需要,引用也不太容易出错(int & 而不是 int *)
  • 此外,当堆栈可以正常工作时,您正在使用堆来创建类的实例。

我怀疑这是你的意图:

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 的值。然后,如果传入的指针不为空,则我们将其分配给所指向的内存,并且当函数返回时,堆栈变量具有来自该类的值。

当然,您实际上不应该这样做 - 您应该以另一种方式提供对值的访问,或者直接通过将它们公开,或者通过添加只返回它们的函数。

public:
    int Vida() {
        return vida;
    }

然后你可以这样做:

cout << "Vida = " << andro->Vida() << endl;

当然,除非有理由使用堆来创建您的 Androide 实例,否则您应该只使用堆栈内存而不是堆。

Androide andro;

代替

Androide *andro = new Androide();
于 2012-03-31T18:05:29.210 回答