【问题标题】:How to initialize an array of user-defined objects with a static ID counter?如何使用静态 ID 计数器初始化用户定义对象数组?
【发布时间】:2020-11-26 00:27:34
【问题描述】:

这是我的代码

#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 Person& p);
        bool operator<=(const Person& p);
        void askPancakesEaten();
        void print();
};

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

bool Person::operator<=(const Person& 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 对象初始化一个数组,并且由于我的静态方法,当我进入我的 for 循环时,它使我的静态计数从 10 开始。
我知道我可以通过更改我的构造函数并摆脱 setID 并只使用 i 来轻松解决这个问题,但我很好奇是否有其他解决方法?

【问题讨论】:

  • 我没有看到任何关于我们为什么会遇到问题的解释。数组默认初始化 10 个人,因此您的静态方法会计算他们。问题出在哪里?
  • 您的问题听起来像是您知道应该使用people[i] 而不是currPerson,但您不想?
  • 为什么会有静态变量?看起来您正在尝试为您创建的每个人创建一个唯一的 ID。但这违背了您的要求,即不要为每个新人创建一个唯一的 ID。那么你想要的逻辑是什么?您可以创建一个重置 ID 的重置方法。
  • 这个数组到底是干什么用的?
  • 我现在明白了。答案是正确的。问题在于,您不是使用 10 个 Person 对象的数组,而是在循环中创建额外的 Person 对象,在 10 次迭代中的每一次迭代中初始化然后丢弃它们。

标签: c++ static static-methods


【解决方案1】:

...但我很好奇是否有其他方法。

为什么要初始化一个数组,然后不在循环中使用呢?

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

除了 setID() 的命名有点令人遗憾(getNextID() 可能是一个更好、更清晰的选择 IMO)之外,您所拥有的实现没有任何问题。

此外,最好将此函数设为private,因为如何保存和管理这些 ID 对于类实例是唯一的,这是一个实现细节,不应公开访问。

【讨论】:

  • getNextID() 函数移出类使其不属于类实例有什么好处?
  • @DavidC.Rankin 我看不到任何东西,除非您将 currID 变成 uuid 等。此 ID 明确绑定到此特定类类型的实例。
  • 有道理,更多的是一种无聊的好奇心。不知道班级规模是否可以考虑。但是staticstatic我想是看待它的方式。 (现在私有更有意义)
  • @DavidC.Rankin 我已经添加了另一个注释应该在课堂上进行更改。
  • @DavidC.Rankin static 成员不会向 claas 的大小添加任何内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多