Как инициализировать массив пользовательских объектов с помощью статического счетчика идентификаторов?

#c #static #static-methods

#c #статический #статические методы

Вопрос:

Вот мой код

 #include <iostream>
#include <string>

class Person {
    private:
        int pancakesEaten, personID;
    public:
        Person() {
            pancakesEaten = 0;
            personID = setID();
        }

        static int setID() {
            static int currID;
            return currID  ; // Returns currID and then increments.
        }

        bool operator>=(const Personamp; p);
        bool operator<=(const Personamp; p);
        void askPancakesEaten();
        void print();
};

bool Person::operator>=(const Personamp; p) {
    if(this->pancakesEaten >= p.pancakesEaten) {
        return true;
    }
    return false;
}

bool Person::operator<=(const Personamp; p) {
    if(this->pancakesEaten <= p.pancakesEaten) {
        return true;
    }
    return false;   
}

void Person::askPancakesEaten() {
    std::cout << "Please enter how many pancakes you ate: ";
    std::cin >> this->pancakesEaten;
}

void Person::print() {
    std::cout << this->personID;
    std::cout << "Person " << this->personID << " ate " << this->pancakesEaten << " pancakes"; 
}

int main() {
    Person people[10];
    for(int i = 0; i<10; i  ) {
        Person currPerson;
        currPerson.askPancakesEaten();
        currPerson.print();
    }
}
 

Моя проблема в том, что я пытаюсь инициализировать массив для объектов 10 Person, и из-за моего статического метода мой статический счетчик начинается с 10, когда я вхожу в цикл for.
Я знаю, что мог бы легко обойти это, просто изменив свой конструктор и избавившись от setID и просто используя вместо этого i, но мне любопытно, есть ли другой способ обойти это?

Комментарии:

1. Я не вижу никаких объяснений, почему у нас проблема. Массив по умолчанию инициализирует 10 человек, поэтому ваш статический метод их подсчитывает. В чем проблема?

2. Ваш вопрос звучит так, как будто вы знаете, что должны использовать people[i] вместо currPerson , но вы не хотите?

3. Зачем вам статическая переменная? Похоже, вы пытаетесь создать уникальный идентификатор для каждого созданного вами пользователя. Но это противоречит тому, что вы просите, а именно не создавать уникальный идентификатор для каждого нового пользователя. Итак, какую логику вы хотите? Вы могли бы создать метод сброса, который сбрасывает идентификатор.

4. Для чего вообще нужен массив?

5. Теперь я понимаю. Ответ правильный. Проблема заключается в том, что вместо использования массива из 10 объектов Person вы создаете дополнительные Person объекты в цикле, инициализируете, а затем отбрасываете их на каждой из 10 итераций..

Ответ №1:

… но мне любопытно, есть ли другой способ обойти это.

Почему вы инициализируете массив и не используете его в цикле?

 for(int i = 0; i<10; i  ) {
    people[i].askPancakesEaten();
    people[i].print();
}
 

Кроме того setID() , это называется немного неудачно запутанным ( getNextID() может быть, лучший, более понятный выбор IMO), в этой реализации нет ничего плохого, поскольку она у вас есть.

Также было бы лучше создать эту функцию private , поскольку то, как эти идентификаторы сохраняются и управляются, чтобы быть уникальными для экземпляров класса, является деталью реализации, которая не должна быть общедоступной.

Комментарии:

1. Есть ли какая-либо выгода в перемещении getNextID() функции из класса, чтобы она не была частью экземпляра класса?

2. @DavidC.Rankin Я ничего не вижу, если только вы не превратитесь currID в uuid или что-то в этом роде. Этот идентификатор явно привязан к экземплярам этого конкретного типа класса.

3. Имеет смысл, на самом деле это скорее праздное любопытство. Не знал, может ли учитываться размер класса. Но static static , я думаю, это способ взглянуть на это. (теперь private делает это более понятным)

4. @DavidC.Rankin Я добавил еще одно замечание о том, что следует изменить в классе.

5. Участники @DavidC.Rankin static ничего не добавляют к размеру claas.