在程序的函数内创建对象数组

时间:2012-06-18 21:13:42

标签: c++ function object

有人可以告诉我,为了在函数中创建一个对象数组(在main函数中除外),我需要做些什么。

我会尝试通过编造某种例子来解释......

假设我有一个名为TimeScheduler.cpp的程序,它实现了Schedule.h类 (我在一个单独的文件Schedule.cpp中实现,我们在其中定义方法)。

在声明文件中,我们声明了两个构造函数

  Schedule(); //the default

  Schedule(int, int, int);//accepts three arguments

要达到目的 - 让我们说在主程序文件TimeScheduler.cpp中,除了从类Schedule继承的函数之外,我们在这个程序中创建了自己的函数。所以我们将原型列在最顶层。

 /*prototypes*/

  void makeSomeTime();

等.....

我们有

 main(){ 


//etc etc...
 }

然后我们定义这些程序函数

    void makeSomeTime(){
      //process
    }

让我们说在函数makeSomeTime()中,我们想创建一个像这样的Schedule对象数组

    Schedule ob[]={ 
       summer(5,14, 49), 
       fall(9,25,50)
    };

我需要对函数makeSomeTime()做什么才能让它创建这个对象数组。 我问的原因是目前我对自己的程序有困难,因为它允许我在main()中创建这个对象数组....但不是像我刚才给出的一个例子。奇怪的是它允许我在函数中创建一个动态的对象数组.....如

   Schedule *ob = new Schedule[n+1];
   ob[2]= Schedule(x,y,z);

为什么它会让我在main()中分配一个非动态数组,但是不能让我在函数中这样做?

2 个答案:

答案 0 :(得分:2)

这是不正确的:

 Schedule ob[]={ 
       summer(5,14, 49), 
       fall(9,25,50)
    };

出现试图引入3个新名字:

  1. ob,这是Scedule s
  2. 的数组
  3. summer,这是Schedule
  4. fall,这是Schedule
  5. 您不能将summerfall作为新名称引入。也许这只是一个错字,你的意思是:

    Schedule ob[]={ 
       Schedule(5,14, 49), 
       Schedule(9,25,50)
    };
    

    ...这是完全正常的,并且可以存在于诸如以下的函数中:

    void make_schedule()
    {
        Schedule ob[]={ 
           Schedule(5,14, 49), 
           Schedule(9,25,50)
        };
    }
    

    但现在您还有另一个问题 - 您的make_schedule函数返回void。您在Schedule中创建的make_schedule数组已创建,然后被丢弃。如果你想从一个功能中返回一个数组,最好的要做的就是使用vector,然后返回:

    std::vector<Schedule> make_schedule()
    {
        Schedule ob[]={ 
           Schedule(5,14, 49), 
           Schedule(9,25,50)
        };
    
        const size_t num_obs = sizeof(ob)/sizeof(ob[0]);
        std::vector<Schedule> ret;
        std::copy( &ob[0], &ob[num_obs], std::back_inserter(ret));
    
        return ret;
    }
    

    较差的替代方法是使用动态分配来分配数组,并返回指向第一个元素的指针。在这种情况下,使用new []时,请注意您只能使用默认构造函数。

答案 1 :(得分:0)

我决定不使用矢量,而是使用unordered_map。我没有意识到,当你用c ++命名一个对象时,你并没有给它起一个名字......它只是用作一种临时引用。如果你想使用名字,最好使用名称作为集合中的一种键值。像:

string foodname;

foodname =“cake”;

[foodname,10.95]

foodname =“bread”;

[foodname,5.75]

我在http://msdn.microsoft.com/en-us/library/bb981993.aspx

上找到了有关unordered_map的帮助