C ++非成员函数

时间:2017-11-06 17:29:22

标签: c++

createPassword(26)

上面是一个非成员函数的代码,它将向视频追加(向列表中添加内容并且列表是私有的函数),并将其返回给视频。它是运算符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);

1 个答案:

答案 0 :(得分:0)

您的功能不会附加到现有框架,而是创建一个附加信息的副本。您的代码不会检索副本,因为这需要实际的分配

这样可行,但效率很低:

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

通常,运营商&lt;&lt; (当用作流媒体运营商时)定义为:

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

请注意,返回值是对第一个参数的引用,该值由操作修改。这是必需,以便正确地允许'daisy-chaining'运算符&lt;&lt;()。