C++ return 来自方法的结构

C++ return structure from method

我想 return 来自方法的结构,但是 returned 结构需要在不同的 class 中使用。这是我当前的代码:

Song.h:

class song{   
  public:
    Song(char szTitle[50]);
    Song();
    struct ToneStruct;
    ToneStruct GetNextNote();
    ~Song();
};

Song.cpp:

struct ToneStruct {
    char cTone;
    int iTime;
    int iTimePassed;
};

ToneStruct Song::GetNextNote(){
while (iTempTime != endOfFile) {
//do stuff
    while (iTempTime != 59) {
        //do stuff
    }
    ToneStruct toneStruct(cTone,iPlayTime, iTimePassed);
    return toneStruct;
}
ToneStruct endStruct('X', 0, 0);
return endStruct;
}

由于该方法,我收到一条错误消息 "declaration is incompatible with song.h",而在方法内部的结构上,它显示 "incomplete type is not allowed"。我做错了什么?

您已在 song class 中向前声明 struct ToneStruct ,这意味着它在 song 命名空间内并且因此可以作为 song::TongStruct 访问,但是您在源文件 外部 song 命名空间中声明了一个 ToneStruct 结构,然后可以将其作为 ToneStruct。编译器会将它们视为不同的类型。

要修复此错误,您应该将前向声明移出 class 或使用 Song::ToneStruct 作为您的类型。

struct ToneStruct 你声明 你的 class Song(或者是 song?)与你声明的 struct ToneStruct 不同在文件级别。前者是成员类型Song::ToneStruct,后者是全局命名空间中的名称

如果你想前向声明 ToneStruct,你需要在任何 class.

之外进行

另一种选择是在整个过程中定义和使用 Song::ToneStruct 而不是 ::ToneStruct

它可能对你帮助不大,因为在这种情况下,前向声明是不够的。 Return 函数类型在函数使用前必须是完整类型。这实际上意味着 song.h 需要在声明 GetNextNote 之前完全定义 struct ToneStruct

如果您只想在 Song.cpp 中使用 GetNextNote,您可以使用前向声明,但 GetNextNote 可能不应该是 public 成员.