2015-05-28 4 views
0

По какой-то причине, когда я пытаюсь запустить свой код, он всегда вызывает конструктор по умолчанию, но он должен вызывать конструктор с параметрами.Как создать объект с конструктором с параметром

#include "pokemon.h" 

int main() 
{ 
    int choice; 

    cout<<"input 1 2 or 3"<<endl; 
    cin>>choice; 

    if(choice==1||choice==2||choice==3) 
    { 
     pokemon(choice); 
    } 

} 

в моем headerfile я есть

#include <iostream> 
#include <string> 
#include <stdlib.h> 
#include <time.h> 

using namespace std; 

class pokemon{ 
public: 
    pokemon();//default constructor 
    pokemon(int a); 
    ~pokemon();//desconstructor 
    pokemon(const pokemon& c); 
    void train(); 
    void feed(); 
    bool isnothappy(); 
    string getName();//accessor for the name 
    int getPowerlevel();//accessor for the power level 
    string getColor();//accessor for the color 
    string getType();//accessor 
    int getHappylevel();//accessor 
    static int getNumObjects(); 
    void set_type(string);//mutator 
    void set_color(string);//mutator 
    void set_power_level(int);//mutator 
    void set_happy_level(int);//mutator 
    void set_name(string);//mutator 
private: 
    string name; 
    string color; 
    string type; 
    int power_level; 
    int happy_level; 
    static int numberobject; 
}; 

и в моем другом файле .cpp У меня есть

int pokemon::numberobject=0;//initialize static member variable 

pokemon::pokemon(){//default constructor 
    name="pikachu"; 
    color="yellow"; 
    type="electric"; 
    power_level=0; 
    happy_level=1; 

    cout<<"The default constructor is being called"<<endl; 
    ++numberobject; 
} 

pokemon::pokemon(int a) 
{ 

    if(a==0) 
    { 
     name="Pikachu"; 
     color="yellow"; 
     type="electric"; 
     power_level=1; 
     happy_level=1; 
    } 


    else if(a==1) 
    { 
     name="Bulbasaur"; 
     color="green"; 
     type="grass"; 
     power_level=1; 
     happy_level=1; 
    } 


    else if(a==2) 
    { 
     name="Charmander"; 
     color="red"; 
     type="fire"; 
     power_level=1; 
     happy_level=1; 
    } 

    else if(a==3) 
    { 
     name="Squritle"; 
     color="blue"; 
     type="water"; 
     power_level=1; 
     happy_level=1; 
    } 

    cout<<"Congratulations you have chosen "<<getName()<<". This " <<getColor()<<" "<<getType()<<" pokemon is really quite energetic!"<<endl; 
    ++numberobject; 
} 

pokemon::~pokemon() 
{ 
    //cout<<"the destructor is now being called"<<endl; 
    //cout<<"the number of objects before the destructor is "<<pokemon::getNumObjects()<<endl; 
    --numberobject; 
    cout<<"Now you have a total number of "<<pokemon::getNumObjects()<<endl; 
} 

pokemon::pokemon(const pokemon& c)//copy constructor 
{ 
    name=c.name; 
    color=c.color; 
    type=c.type; 
    power_level=c.power_level; 
    happy_level=c.happy_level; 
    ++numberobject; 
} 

У меня есть оба мои конструкторы объявлены и определены в других моих файлах, но это штопать вещь всегда вызывает конструктор по умолчанию

+0

'pokemon (выбор);' Что делает эта линия? – PaulMcKenzie

+0

@PaulMcKenzie pokemon (выбор) даже не получил извинения по какой-то причине, он просто переходит к конструктору по умолчанию – Brogrammer93

+0

Можете ли вы показать нам фрагмент 'pokemon.h' – dlavila

ответ

3

Этот код:

pokemon(choice); 

означает то же самое:

pokemon choice; 

Он объявляет переменную с именем choice типа pokemon, и нет никаких аргументов, переданных конструктору. (В некоторых местах вы можете помещать дополнительные скобки в объявлениях).


Если вы имели в виду, чтобы объявить переменную, где choice является аргументом конструктора, то вы должны написать:

pokemon foo(choice); 

Если вы имели в виду, чтобы создать временный объект (который будет немедленно уничтожен) с choice в качестве аргумента вы можете написать (pokemon)choice;, или pokemon(+choice);, или с C++ 11, pokemon{choice};.


Эта проблема двусмысленности между декларациями и не деклараций может возникнуть в любое время заявление начинается с именем-типа с последующим (. Правило состоит в том, что если оно синтаксически корректно для объявления, то оно рассматривается как объявление. См. для других подобных случаев.

Смежные вопросы