【问题标题】:Class method interaction with static and const [closed]类方法与静态和常量的交互[关闭]
【发布时间】:2012-09-02 14:30:36
【问题描述】:

代码:

   #include <iostream>
    using namespace std;

    class Item
    {
        int num;
    public:
        Item(int i) : num(i) {};
        int getNum() const { return num; }
    };

    class ItemPool
    {
    public:
        Item* getItem (int);
    };

    Item* ItemPool::getItem (int n)
    {
        static Item myX(0);
        if (n%2) return &myX;
        else return new Item(n);
    }

    void main()
    {
        ItemPool coll;
        for (int i=0; i<100; i++)
        {
                  Item* anX = coll.getItem(i);
                  cout<<anX->getNum()<<’\n’;
        }
    }

问题:

1) 该程序在执行过程中有哪些语义问题?

2) 只更改 main() 函数,使程序的行为保持不变,但消除了这个问题。

谢谢!!

【问题讨论】:

  • 这看起来像家庭作业,但没有这样标记。
  • main() 总是返回 int,不管微软的 IDE 做什么。打破这个习惯!
  • @VaughnCato 只是我在准备考试,这不是家庭作业...如果是我会这样标记的:)
  • @PeteBecker 好的,谢谢你的提示 :)
  • @Vidak:我不确定这种情况下的具体政策,但我认为将其标记为作业是个好主意。至少,最好在您的问题中说明这是来自书本的问题,并具体说明您遇到困难的地方。

标签: c++ oop class methods


【解决方案1】:

语义问题是ItemPool::getItem() 方法可以返回指向动态分配对象或静态对象的指针。不清楚谁拥有动态分配的对象,调用者无法知道他们是否必须解除分配对象,不知道ItemPool::getItem()的实现细节。

我认为没有办法改变以消除问题保持程序行为相同。程序行为是错误的,因此解决问题会改变其行为。

i%2==0cout 之后,您可以修改main() 以释放Items。但这会改变程序的行为,因为不再有内存泄漏。

void main()
{
  ItemPool coll;
  for (int i=0; i<100; i++)
  {
    Item* anX = coll.getItem(i);
    std::cout << anX->getNum() << "\n";
    if (i%2) == 0 delete anX;
  }
}

【讨论】:

  • 我同意您的一般评估,但也许任务是查看存在内存泄漏并仅通过更改 main 来避免它。
  • @VaughnCato 也许,但这会改变程序的行为:-)
  • @juanchopanza 是的,我确信 main 的编辑版本是需要的 :) 谢谢!
  • "我看不出有什么办法可以消除问题并保持程序行为不变。" 返回shared_ptr&lt;Item&gt;
  • @ildjarn 它将改变程序的行为并且它不仅仅涉及对main() 的修改。第一点可能是我只是在开玩笑,但第二点显然违反了问题的要求。
猜你喜欢
  • 2012-12-04
  • 2015-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 2012-08-01
  • 1970-01-01
相关资源
最近更新 更多