C ++ возвращает структуру из метода - PullRequest
0 голосов
/ 20 февраля 2019

Я хотел бы вернуть структуру из метода, но возвращенную структуру необходимо использовать в другом классе.Это мой текущий код:

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;
}

Из-за метода я получаю сообщение об ошибке «объявлениенесовместим с song.h "и в структурах внутри метода он говорит" неполный тип не допускается ".Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

struct ToneStruct вы объявляете внутри ваш class Song (или song?) Отличается от struct ToneStruct, который вы объявляете на уровне файла.Первый тип Song::ToneStruct, последний - имя в глобальном пространстве имен.

Если вы хотите объявить вперед ToneStruct, вам нужно сделать это вне любогоclass.

Другим вариантом является определение и использование Song::ToneStruct вместо ::ToneStruct повсюду.

Это, вероятно, вам мало поможет, потому что в этом случае недостаточно предварительного объявления.Тип возвращаемого значения функции должен быть полным, прежде чем использовать функцию.Это практически означает, что song.h должен полностью определить struct ToneStruct, прежде чем вы сможете объявить GetNextNote.

Если вы хотите использовать GetNextNote только внутри Song.cpp, вам может потребоваться предварительное объявление, но тогда GetNextNote, вероятно, не должно быть публичным членом.

0 голосов
/ 20 февраля 2019

Вы объявили вперед struct ToneStruct внутри класса song, что означает, что он находится внутри пространства имен song и, таким образом, доступен как song::TongStruct, но вы объявили структуру ToneStructв исходном файле за пределами пространства имен song, которое затем будет оцениваться как ToneStruct.Компилятор будет видеть их как разные типы.

Чтобы исправить ошибку, вы должны либо убрать предварительное объявление из класса, либо использовать Song::ToneStruct для вашего типа.

...