2017-08-29 51 views
0

似乎是对feed矢量的迭代不会调用绘制函数。我在里面添加了一些断点,但没有一个被触发。对矢量的迭代不会调用函数

数据是由我的程序的其他部分传递的字符串矢量,它可以正常工作(输出文件很好)。

std::vector<std::unique_ptr<NewsRenderer>> feed; 

std::unique_ptr<NewsRenderer> ptr=std::make_unique<NewsRenderer>(NewsRenderer(sf::Vector2i(300, 100), "test-title", "test-url")); 
feed.push_back(std::move(ptr)); 

myfile.close(); 

while (window.isOpen()) 
{ 
    window.clear(sf::Color::White); 
    for (int i = 0; i < feed.size(); i++) 
    { 
     feed[i]->draw(0, 100 * i); 
    } 

    window.display(); 
} 

有NewsRenderer.h

#include "News.h" 

#include <iostream> 
class NewsRenderer 
{ 
public: 
    NewsRenderer(std::string title, std::string url, std::string decription=""); 
    void draw(int x, int y); 
    ~NewsRenderer(); 
private: 
    News* newsData; 
}; 

而且NewsRenderer.cpp

NewsRenderer::NewsRenderer(std::string title, std::string url, std::string decription) 
{ 
    newsData = new News{ title, url, decription }; 
} 

void NewsRenderer::draw(int x, int y) 
{ 
    draw(title, x, y); //magic, but I didn't want to use any libraries in this example 
} 

NewsRenderer::~NewsRenderer() 
{ 
} 

所以我的问题是:这是怎么回事?我该如何解决它?

PS。我试图保持简单,所以如果我跳过任何重要的细节,让我知道,我会交付。

+0

如果在调试器中逐行执行代码,它看起来像是应该如何工作? –

+1

你的问题是什么? –

+0

@Someprogrammerdude是的。它的工作,直到它'饲料[我] - >绘制'。然后它跳过这一行而不跳入绘图功能。 – frogi16

回答

1
#include <vector> 
#include <string> 
#include <memory> 
#include <iostream> 

struct News { 
    const std::string title; 
    const std::string url; 
    const std::string description; 
}; 

struct NewsRenderer { 
    NewsRenderer(std::string title, std::string url, std::string description="") 
    : data(new News{title, url, description}) 
    { } 

    ~NewsRenderer() 
    { delete data; } 

    void draw() const 
    { std::cout << data->title << " - " << data->url << " - " << data->description << '\n'; } 

    const News* data; 
}; 

void foo() { 
    std::cout << "foo()\n"; 
    std::vector<std::unique_ptr<NewsRenderer>> feed{}; 

    auto p = std::make_unique<NewsRenderer>("title", "url", "description"); 
    //          ^^^^^^^^^^^^ <= forwards arguments to NewsRenderers constructor 
    feed.push_back(std::move(p)); 
    for(auto& nr : feed) nr->draw(); 
} 

void bar() { 
    std::cout << "bar()\n"; 
    std::vector<std::unique_ptr<NewsRenderer>> feed{}; 

    auto p = std::make_unique<NewsRenderer>(NewsRenderer{"title", "url", "description"}); 
    //          ^^^^^^^^^^^^ <= tries to invoke copy constructor, not safe 
    feed.push_back(std::move(p)); 
    for(auto& nr : feed) nr->draw(); 
} 

int main() { 
    foo(); 
    bar(); 
    return 0; 
}