2012-03-31 64 views
-2

所以我有这个问题,其中输出打印我的指针的地址,我不知道为什么发生这种情况的Cuz指针在所有指针会随机打印出来的地址,而不是它的尖值,C++

没有被修改继承人的代码:

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 
+1

请写出标准的英语。我在你的代码中没有提到西班牙文,而是用你描述并且询问你的代码的看似故意潦草的英文。 – thb 2012-03-31 03:53:40

+2

我建议你阅读一本[很好的C++书](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)。您似乎正在将Java思想应用于C++,这是一种非常糟糕的方式。 – Pubby 2012-03-31 03:54:15

+0

是的,实际上最后一个学期,我使用的是java:P,对西班牙语的东西感到抱歉......我懒得编辑所有的东西= /。不管怎样,谢谢你们两位! – 2012-03-31 04:00:29

回答

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

}; 

宝当函数返回时,vi,fuve会变为无效。您没有看到正在打印的地址,而只是垃圾。

您的整个设计并不需要使用指针。

+0

哦,我正在使用它们,因为我们的老师说我们必须学习如何在我们所做的一切中使用它们。 K,所以没有需要的指针。谢谢! – 2012-03-31 03:55:29

+0

Dude btw你做了什么来发布代码格式良好?我在这里是新的=/ – 2012-03-31 03:56:12

+0

@AlejandroGonzalez你的老师误导了 - 正确的C++很少使用指针。要格式化代码,请选择文本并按下“[{}]”按钮。您也可以缩进4列以达到相同的效果。欢迎来到这个网站! – Pubby 2012-03-31 03:57:38

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为指针的地址,并通过空在那里,因为我们不希望FUERZA的价值,我们可以通过了一个额外的地址。然后,我们分配给由传入的指针指向的内存,如果它们不为null,并且函数返回时,堆栈变量将具有该类的值。

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

public: 
    int Vida() { 
     return vida; 
    } 

然后,你可以这样做:

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

,当然,除非有一个理由使用堆来创建Androide例如,你应该只使用堆栈内存,而不是堆的。

Androide andro; 

,而不是

Androide *andro = new Androide(); 
相关问题