指针将随机打印它的地址而不是它的指向值C ++

时间:2012-03-31 03:43:41

标签: c++ pointers inheritance c++-address

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

下面是代码:

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 

2 个答案:

答案 0 :(得分:3)

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

};

当函数返回时,指向vifuve的指针无效。你没有看到地址被打印,只是垃圾。

您的整个设计不会也不应该使用指针。

答案 1 :(得分:0)

您所看到的是您的函数的形式参数的地址。基本无意义的值是无用的,并且基本上是指向堆栈上随机位置的指针 - 无论何时堆栈恰好是在您调用构造函数时。除非您试图了解有关计算机和编译器如何工作的更多信息,否则您基本上永远不会对这些值感兴趣。

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

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

  • 您正在尝试在类中存储数据,而您要存储的类型是:
    • 与指针相同的大小(int)
    • 没有理由在课堂外保留记忆(无论如何都没有显示)
    • 即使你需要,引用也不会容易出错(int&amp;而不是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的值。然后我们分配给传入指针所指向的内存,如果它们不是null,并且当函数返回时,堆栈变量具有类中的值。

当然,您不应该实际执行此操作 - 您应该以另一种方式提供对值的访问,可以直接通过公开它们,也可以添加仅返回它们的函数。

public:
    int Vida() {
        return vida;
    }

然后你可以这样做:

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

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

Androide andro;

而不是

Androide *andro = new Androide();