2011-11-09 61 views
1

我正在實施一個計時器,以便將花在各種事件上的時間分類並列出。類的聲明去的東西如下:如何在C++中使用嵌套類?

#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_; 
}; 

然後,在源文件中,我打算實現「時間」功能,就像這樣:

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 

任何人都可以試圖幫忙嗎?


--Revised:

我已經修改了時間功能,以便它現在的樣子:

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)' 

我應該再在源文件中聲明什麼樣的靜態對象?

+0

從您的測試用例的所有元素不涉及的問題/問題,請。 –

+0

你真的必須讓'TimerEvent'和'TimedEvent'具有這樣的相似名字嗎? – AusCBloke

+0

@ TomalakGeret'kal:感謝您指出,刪除。 – derekhh

回答

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

在源文件中,你應該實現Time爲:

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

參數列表太多,methinks –

+0

@Tomalak Geret'kal:它看起來'TimerEvent'和'TimedEvent'是不同的類型,'TimerEvent'具有它自己的頭,但我不太確定...即使參數是'TimedEvent',我相信一旦在參數列表中編譯器已經知道該函數的作用域是'Timer'。 –

+1

斑點。多麼可怕的命名方案! –