2012-03-30 63 views
0

我有一個名爲Song的內部類創建器。以下是Song.h文件。請忽略評論。C++內部類無法編譯

#ifndef SONG_H 
#define SONG_H 
#include <iostream> 


class Song 
{ 
    public: 
    class Creator{ 

     public: 
     //Creator& name(const std::string name){}; 
     void name(const std::string name){}; 

     //std::string getName(){}; 
    }; 


    private: 
    std::string mName; 
}; 

#endif // SONG_H 

,這裏是Song.cpp類

#include "Song.h" 

using std::string; 
//using Song::Creator; 
//Song::Creator& Song::Creator::name(const string name) 
void Song::Creator::name(const string name) 
{ 
    mName=name; 
    std::cout<<name; 
    //return *this; 
} 

//string Creator::getName() 
//{ 
    //return mName; 
//} 

和主類

#include <iostream> 
#include "Song.h" 

int main() 
{ 
Song::Creator sc; 
sc.name("vickey"); 
//std::cout<<sc.getName(); 

return 0; 
} 

在編譯時,它拋出

/home/vickey/qtprojects/innerClass-build-desktop-Desktop_Qt_4_8_0_for_GCC__Qt_SDK__Release/../innerClass/Song.cpp:6: error: redefinition of 'void Song::Creator::name(std::string)' 

,如果我更改名稱功能到

void Creator::name(const string name) 
{ 
    mName=name; 
    std::cout<<name; 
    //return *this; 
} 

我得到這個錯誤

/home/vickey/qtprojects/innerClass-build-desktop-Desktop_Qt_4_8_0_for_GCC__Qt_SDK__Release/../innerClass/Song.cpp:6: error: 'Creator' has not been declared 

什麼是我在做錯了嗎?提前致謝。

+0

風格建議:像'SONG_H'這樣的短名稱有一天會發生碰撞,而從經驗來看,標題防守衝突很可能讓人困惑。就我個人而言,我會做'',例如'#ifndef SONG_H_20120330'。由於時間不可逆,如果在同一天有多個相同名稱的文件(在這種情況下,您寫'SONG_20120330a'或'SONG_20120330_1959') – 2012-03-30 08:10:13

+0

謝謝我會記住 – 2012-03-30 08:14:56

回答

6

從類聲明中刪除定義:

void name(const std::string name){}; 

變化到

void name(const std::string name); 

{}表示的定義。

+0

感謝您的回覆。我想讓內部類訪問外部類私有變量。通過類似的文章衝浪,我發現C++中的Inner類需要存儲對Outer類的引用,這與Java不同。 – 2012-03-30 07:37:56