С ++ Нулевой вывод при вызове функции - PullRequest
0 голосов
/ 28 мая 2020

Ниже приведен фрагмент кода из моей основной программы

Мой H-файл

class Person{
public:
     std::string name;
     int rangeStance;
     int initialStance;

Person(std::string name, int rangeStance, int initialStance){
     name = name;
     rangeStance = rangeStance;
     initialStance = initialStance;

     setName(getName());
     setRangestance(getRangeStance());
     setinitalStance(getRangeStance());
}
Person();
    void setName(std::string name);
    void setRangestance(int range);
    void setinitalStance(int stance);

    std::string getName();
    int getRangeStance();
    int getinitalStance();
    double impact(int rangeStance, int  initalStance);

};

class Leader: public Person {

    public:
     int popularity;
     int totalcountryVotes;

     Leader(std::string name, int rangeStance, int initialStance,int popularity, int totalcountryVotes)
     :Person(name,  rangeStance, initialStance), popularity(popularity), totalcountryVotes(totalcountryVotes){

          popularity = popularity;
          totalcountryVotes = totalcountryVotes;
          setPopularity(getPopularity());
          setTotalcountryVotes(getTotalcountryVotes());
     }

     Leader();   
     void setPopularity(int popularity);
     void setTotalcountryVotes(int totalcountryVotes);
     int getPopularity(); 
     int getTotalcountryVotes();   
};

Соответствующие функции в основном cpp файле.

Person::Person() {
}

      void Person::setName(string Name)
        {
           name = Name;
        } 

        string Person::getName() {
              return name;
        }


        void Person::setRangestance(int Range)
        {

      rangeStance = Range;

        }

        int Person::getRangeStance() {
              return rangeStance;
        }

          void Person::setinitalStance(int stance)
        {

            initialStance = stance;                                            

        } 

        int Person::getinitalStance() {
              return initialStance;
        }



Leader::Leader() {

}

    void Leader::setPopularity(int popularity) {

          popularity = popularity;

     }


    void Leader::setTotalcountryVotes(int totalcountryVotes) {
          totalcountryVotes = totalcountryVotes;
     } 


     int Leader::getPopularity() {

           return popularity;
     }


    int Leader::getTotalcountryVotes() {
          return totalcountryVotes;
    }

Внутри main необходимые функции вызываются соответствующим образом

int main(int argc, char* argv[]) {

Leader labourLeader("George Lopez",100,50,50, 75);//sets record for the labour party leader

cout << "--Party Leader--" << endl;
cout << labourLeader.getName() << endl;

return 0;
}

Однако, когда этот фрагмент кода компилируется, результат не возвращается там, где он должен печатать «Джордж Лопес». Я довольно "новичок" в C ++, правильно ли я использую свой конструктор или я должен использовать его в моем h-файле? Спасибо.

Ответы [ 2 ]

1 голос
/ 28 мая 2020

В этом коде есть несколько ошибок

Person(std::string name, int rangeStance, int initialStance){
    name = name;
    rangeStance = rangeStance;
    initialStance = initialStance;
    setName(getName());
    setRangestance(getRangeStance());
    setinitalStance(getRangeStance());
}

Во-первых, нет необходимости вызывать сеттеры и выполнять присваивания, поэтому давайте отбросим их, оставив

Person(std::string name, int rangeStance, int initialStance){
    name = name;
    rangeStance = rangeStance;
    initialStance = initialStance;
}

Теперь подумайте о что делает name = name. Вам это вообще кажется любопытным? Он берет параметр name и назначает его параметру name! Переменная-член, также называемая name, полностью не изменилась. Эта ситуация, когда одно имя скрывает другое похожее имя, называется затенение .

1 голос
/ 28 мая 2020
Person(std::string name, int rangeStance, int initialStance) {
    name = name;

Здесь происходит то, что он просто перезаписывает параметр самим собой, а не копирует его в переменную-член. Это потому, что правила поиска имен для неквалифицированных имен в этот момент предпочитают параметр переменной-члену. Это означает, что переменная-член остается в созданном состоянии, в пустой строке.


Есть несколько способов исправить это. Во-первых, просто назовите их по-другому, чтобы не было двусмысленности, например, обычный метод префикса переменных-членов с помощью m_. Таким образом, оператор становится более явным:

m_name = name;

Другой альтернативой является явный тот, который вы назначаете, чтобы он больше не был неквалифицированным:

this->name = name;

Третий - использовать списки инициализаторов, правила которых немного отличаются тем, что они используют переменную-член вне круглых скобок и выполняют обычный неквалифицированный поиск в скобках:

Person(std::string name, int rangeStance, int initialStance)
    : name(name)
    , rangeStance(rangeStance)
    , initialStance(initialStance)
    //      ^             ^
    //      |             |
    //      |             +- normal lookup, passed-in parameter.
    //      +--------------- member variable.
{
};

И нет необходимости иметь все эти другие операторы в конструкторе, такие как setName(getName()), поскольку вы уже задали имя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...