如何在C ++中使用嵌套类?

时间:2011-11-09 22:55:48

标签: c++ nested-class

我正在实现一个Timer,以便分配和列出花在不同类型事件上的时间。类声明如下:

#include "timer_event.h"
#include <boost/timer.hpp>
#include <vector>

class Timer {
 private:
  class TimedEvent;
 public:
  static TimedEvent* Time(TimerEvent e);
 protected:
 private:
  class TimedEvent {
       public:
    TimedEvent(double seconds, TimerEvent event);
    ~TimedEvent();
   protected:
   private:
    TimerEvent event_;
    double seconds_;
  };
  static boost::timer watch_;
};

然后,在源文件中,我打算将“Time”函数实现为:

TimedEvent* Time(TimerEvent e) {
  TimedEvent* ret = new TimedEvent(watch_.elapsed(),e);
  return ret;
}

但是,编译器的错误消息是:

../utils/timer.cc:24:1: error: ‘TimedEvent’ does not name a type

有人可以尝试帮忙吗?


- 修订:

我修改了时间功能,现在它看起来像:

Timer::TimedEvent* Timer::Time(TimerEvent e) {
  TimedEvent* ret = new TimedEvent(watch_.elapsed(),e);
  return ret;
}

但是,由于“时间”在类声明中声明为静态函数。我们需要在cpp文件中声明静态对象,因为我在链接器的错误消息中得到了这个:

timer.cc:(.text+0x76): undefined reference to `Timer::TimedEvent::TimedEvent(double, TimerEvent)'

我应该在源文件中声明什么样的静态对象?

2 个答案:

答案 0 :(得分:3)

这是编译器错误,而不是链接器错误。

据推测,你的Time应该是这样的:

TimedEvent* Timer::Time(TimerEvent e) {
   TimedEvent* ret = new TimedEvent(watch_.elapsed(),e);
   return ret;
}

顺便说一下,我真的不喜欢一切都以“时间”开头!

现在,在函数内部,您可以使用TimedEvent。但返回类型不在函数内:您必须将类型限定为Timer::TimedEvent

Timer::TimedEvent* Timer::Time(TimerEvent e) {
   TimedEvent* ret = new TimedEvent(watch_.elapsed(),e);
   return ret;
}

此外,您需要在某处定义Timer::TimedEvent的构造函数。

答案 1 :(得分:1)

在源文件中,您应该将Time实现为:

Timer::TimedEvent Timer::Time( TimerEvent e ) { ... }