C++非成员函数

C++ non-member function

本文关键字:函数 成员 C++      更新时间:2023-10-16
template <typename Frame>
Video<Frame> operator<<(const Video<Frame>& video,const Frame& newFrame){
    Video<Frame> v1(video);
    v1.append(newFrame);
    return v1;
}

上面是一个非成员函数的代码,它将向视频附加(向列表添加某些内容并且列表是私有的函数)内容并返回它。它是算子<<的非成员函数。

以下是main.cpp.我不知道为什么当我返回并使用Utilities::printCharVideo(video);打印视频时,它没有显示任何内容。但是,如果我在函数中使用此代码,它确实会打印出一些内容。所以问题是,为什么视频没有存储我附加到它的东西,以及如何修复它?

int main() {
    Video< Image<char> > video(5, 5, 1);
    video << (Image<char>(5, 5, Utilities::PIXELS_2))
          << (Image<char>(5, 5, Utilities::PIXELS_0))
          << (Image<char>(5, 5, Utilities::PIXELS_1))
          << (Image<char>(5, 5, Utilities::PIXELS_2));
    Utilities::printCharVideo(video);
}

U 函数不会附加到现有框架,而是创建一个包含附加信息的副本。您的代码不会检索副本,因为这需要实际的赋值

这将有效,但效率非常低:

int main() {
    // note how your operator<< accepts a temporary rvalue as its first
    // argument... This points to something not being right.
    Video<Image<char>> video = Video<Image<char>>(5, 5, 1) 
          << (Image<char>(5, 5, Utilities::PIXELS_2))
          << (Image<char>(5, 5, Utilities::PIXELS_0))
          << (Image<char>(5, 5, Utilities::PIXELS_1))
          << (Image<char>(5, 5, Utilities::PIXELS_2));
    Utilities::printCharVideo(video);
}

通常,运算符<<(用作流式处理运算符时)定义为:

template <typename T, typename U>
T& operator << (T& t, const U& u)
{
    //... some code that append u to t, 
    //    like t += u, or similar operation
    //    that actually augments t.
    return t;
}

请注意,返回值是对第一个参数的引用,该值由操作修改。 这是允许"菊花链"运算符 <<() 正确执行所必需的。