2017-08-29 1 views
0

Es scheint, dass Iteration über Feed-Vektor keine Zeichenfunktionen aufruft. Ich habe ein paar Breakpoints innerhalb hinzugefügt und keiner von ihnen wurde ausgelöst.Iteration über Vektor ruft keine Funktionen auf

Daten sind ein Vektor von Strings, die von einem anderen Teil meines Programms geliefert werden, und es funktioniert korrekt (Ausgabedatei ist in Ordnung).

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

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

Und 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() 
{ 
} 

Also meine Fragen sind: Was ist los? Und wie kann ich es reparieren?

PS. Ich habe versucht, es einfach zu halten, also lassen Sie mich wissen, wenn ich irgendwelche wichtigen Details überspringe, und ich werde liefern.

+0

Wenn Sie den Code Zeile für Zeile in einem Debugger durchlaufen, scheint es zu funktionieren, wie es sollte? –

+1

Und was ist Ihre Frage? –

+0

@Someprogrammerdude Ja. Es funktioniert, bis es zu "feed [i] -> draw" kommt. Dann überspringen Sie einfach diese Zeile, ohne in die Zeichenfunktion zu springen. – frogi16

Antwort

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