0
SongPart mtm::SongStructure::getPart(int index) const {
    assert(index >= 0 && index < num_of_parts);
    return song_parts[index];
}

const SongPart& mtm::Song::operator[](int index) const {
    assert(index >= 0 && index < song_length);
    return (song_format->getPart(index));
}

我从第二个函数的返回值中得到这个警告:

返回对临时的引用 [默认启用]

如何解决这个问题?而且我不能改变每个函数的返回值!

4

3 回答 3

4

您会收到警告,因为getPart返回. 如果它返回对 的引用,那么您的代码将是正确的。song_parts[index]song_parts[index]

因此,您需要将返回类型更改getPartSongPart const&

SongPart const & mtm::SongStructure::getPart(int index) const {
    assert(index >= 0 && index < num_of_parts);
    return song_parts[index];
}

是必要的const,因为该函数是const成员函数。

当您将断言转接到哪个呼叫时,为什么还要使用assertin呢?写这个:operator[]getPart

const SongPart& mtm::Song::operator[](int index) const {
    //assert(index >= 0 && index < song_length); not needed!
    return (song_format->getPart(index));
}

在不需要时避免额外的边界检查。

于 2013-01-18T21:19:21.833 回答
2

将第一个函数更改为:

const SongPart& mtm::SongStructure::getPart(int index) const {
    assert(index >= 0 && index < num_of_parts);
    return song_parts[index];
}

原因是song_format->getPart(index)按值返回的调用,因此在第二个函数的堆栈上创建了一个本地。如果您返回对它的引用,则在第二个函数返回后,Boom....

于 2013-01-18T21:18:18.790 回答
1

如果您无法更改 的返回类型getPart(),那么您将无法有效地调用它。让我们考虑如何在不调用getPart().

解决方案1:调用其他函数:

const SongPart& mtm::SongStructure::getPartReference(int index) const {
    assert(index >= 0 && index < num_of_parts);
    return song_parts[index];
}

const SongPart& mtm::Song::operator[](int index) const {
    assert(index >= 0 && index < song_length);
    return (song_format->getPartReference(index));
}

解决方案#2:song_parts[index]直接从operator[]

const SongPart& mtm::Song::operator[](int index) const {
    assert(index >= 0 && index < song_length);
    return (song_format->song_parts[index]);
}
于 2013-01-18T21:25:09.257 回答