2017-01-03 5 views
1

Wenn ich das Programm laufen bekomme ich Müll Werte anstelle von 2 und 4 und 6.Mysterious int Wert von Standardkonstruktors

-858993460 
-858993460 
Sum of potion charges: -858993460Press any key to continue . . . 

Ich kann nicht sehen, warum der Konstruktor alles andere als die Parameter initialisieren würde ich gab in Main.

potions.cpp:

#include "stdafx.h" 
#include "potions.h" 


int Potion::getCharges() const 
{ 
    return potion_charges; 
} 

Potion::Potion() 
{ 
    int potion_charges = 0; 
} 

Potion::Potion(int charges) 
{ 
    int potion_charges = charges; 
} 

Potion::~Potion() 
{ 
    ; 
} 

Potion operator+(const Potion &potion_charges1, const Potion &potion_charges2) 
{ 
    return Potion(potion_charges1.potion_charges + potion_charges2.potion_charges); 
} 

potions.h:

#pragma once 
#include "stdafx.h" 
using namespace std; 

#ifndef POTIONS_H 
#define POTIONS_H 

class Potion 
{ 
private: 
    int potion_charges;                 
public: 
    Potion();      // Default constr 
    Potion(int charges);   // Overloaded constr 
    ~Potion();      // Destr 
    int getCharges() const; 
    friend Potion operator+(const Potion &potion_charges1, const Potion &potion_charges2); 
}; 

#endif 

main.cpp:

#include "stdafx.h" 
#include "potions.h" 
#include <iostream> 

int main() 
{ 
    Potion potion1(2); 
    Potion potion2(4); 
    Potion potion3 = potion1 + potion2; 
    cout << potion1.getCharges() << endl 
     << potion2.getCharges() << endl; 
    cout << "Sum of potion charges: " << potion3.getCharges(); 
    system("PAUSE");  
    return 0; 
} 
+1

Sie aktualisieren nie die Mitgliedsvariable 'trank_charges' und daher enthält sie ungültige Werte, da sie nicht initialisiert ist. – Rakete1111

+0

Beitragstext, keine Bilder von Text. – melpomene

Antwort

3

Innerhalb der Konstrukteurs

Potion::Potion() 
{ 
    int potion_charges = 0; 
} 
Potion::Potion(int charges) 
{ 
    int potion_charges = charges; 
} 

Sie definieren und initialisieren lokale Variablen mit dem Namen potion_charges, die nichts mit der Elementvariablen potion_charges zu tun haben. Das Mitglied potion_charges ist überhaupt nicht initialisiert.

sie ändern:

Potion::Potion() 
{ 
    potion_charges = 0; 
} 
Potion::Potion(int charges) 
{ 
    potion_charges = charges; 
} 

Oder verwenden member initializer list:

Potion::Potion() : potion_charges(0) {} 
Potion::Potion(int charges) : potion_charges(charges) {} 
+0

Danke, das macht es klar. –

2

Wie songyuanyao sagt. Sie aktualisieren nie Ihre Mitgliedsvariable, nur eine lokale Variable mit demselben Namen.

Ich schlage vor, Sie Ihre Klassendefinition aufzuräumen, und bauen es mit einem modernen Compiler:

class Potion 
{ 
private: 
    int potion_charges = 0; // Follows the c++ core guidelines. The default value 
          // is in the class definition itself.                
public: 
    Potion(int charges) : potion_charges(charges) 
    {} 
    int getCharges() const; 
    friend Potion operator+(const Potion &potion_charges1, const Potion &potion_charges2); 
}; 

Ihre Klasse auch benötigt keine Benutzer definiert destructor, da es keine Ressource verwaltet. Es ist in der Regel am besten, die Rule of Zero/Three/Five

+0

Leider hat VS2015 mich nicht gewarnt, aber dank euch beiden ist das ein Fehler, den ich nie wieder machen werde. –

+0

@ PaulPawłowski - Variable Shadowing ist legal C++. Daher ist es normalerweise schwierig, Compiler dazu zu bringen, davor zu warnen. Ich bin froh, dass du deine Hilfe bei SO bekommen hast. – StoryTeller

0
Potion::Potion() : potion_charges(0) {} 
Potion::Potion(int charges) : potion_charges(charges) {} 

Ihre potion_charges folgen in Konstruktor Auto variabel ist, nicht die der Klasse abgelegt.