2012-03-30 10 views
0

私は内部クラスCreatorを持つ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; 
} 

私は私が間違ってやってmがいることは何か

/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'と書いてください) –

+0

これを念頭に置いておいてください –

答えて

6

クラス宣言から定義を削除:

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

変化{}

void name(const std::string name); 

には、定義を表します。

+0

返信ありがとう。私は、内部クラスが外部クラスのプライベート変数にアクセスするようにしたかったのです。 C++のInnerクラスは、Javaとは異なり、Outerクラスへの参照を格納する必要があることが分かりました。 –

関連する問題