2012-03-31 78 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();