【问题标题】:C++ inner classes not compilingC ++内部类未编译
【发布时间】:2012-03-30 07:09:21
【问题描述】:

我有一个名为 Song 的类,内部类 Creator 。下面是 Song.h 文件。请忽略 cmets。

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

如果我将 name 函数更改为

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

我做错了什么?提前致谢。

【问题讨论】:

  • 风格建议:像SONG_H 这样的短名称总有一天会发生冲突,根据经验,header-guard 冲突非常令人困惑。就个人而言,我做&lt;NAME_OF_FILE_DATETIME&gt;,例如#ifndef SONG_H_20120330。因为时间不可逆,只有在同一天有多个同名文件时才会发生冲突(在这种情况下,你写 SONG_20120330aSONG_20120330_1959
  • 谢谢,我会记住这一点

标签: c++ class inner-classes


【解决方案1】:

从类声明中删除定义:

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

改成

void  name(const std::string name);

{} 代表一个定义。

【讨论】:

  • 感谢您的回复。我想让内部类访问外部类私有变量。浏览类似的帖子,我发现 C++ 中的内部类需要存储对外部类的引用,这与 Java 不同。
猜你喜欢
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多