2012-03-30 33 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