2014-11-27 3 views
0

std :: list 내부에 저장된 메서드로부터 메서드를 호출해야합니다. 현재 루프가 실행되고 내부의 인쇄물이 콘솔에 인쇄되지만 목록 안의 요소는 실제로 예상 한 내용을 인쇄하지 않습니다.반복자에서 메서드 호출하기

#include "TextWindow.hpp" 
#include "TextElement.hpp" 

#include <iostream> 
TextWindow::TextWindow(const TextureHolder& textures, const FontHolder& fonts, sf::Window& windows, Fonts::ID fontID, sf::String text) 
: mSprite(textures.get(Textures::WindowDefault)) 
, mHitpoints(10) 
, mWindow(windows) 
{ 
    sf::FloatRect bounds = mSprite.getLocalBounds(); 
    mSprite.setOrigin(bounds.width/2.f, bounds.height/2.f); 
    addElements(text, fonts.get(fontID)); 
} 

void TextWindow::addElements(sf::String text, sf::Font font) 
{ 
    TextElement e(text, font, 10, xPos, yPos, 10, 10); 
    mElements.push_back(e); 
} 

void TextWindow::drawCurrent(sf::RenderTarget& target, sf::RenderStates states) const 
{ 
    target.draw(mSprite, states); 
    for(std::list<Element>::const_iterator iterator = mElements.begin(); iterator != mElements.end(); ++iterator) 
    { 
     //std::cout << "IN TEXTWINDOW PRINT ITERATOR" << std::endl; 
     (*iterator).drawCurrent(target, states); 
    } 

} 

void TextWindow::updateCurrent(sf::Time dt) 
{ 
} 

그리고

#include "TextElement.hpp" 
#include <iostream> 

TextElement::TextElement(sf::String text, sf::Font font, int textSize, int xOrig, int yOrig, int xPos, int yPos) 
: mText(text, font, textSize) 
, xpos(xPos) 
, ypos(yPos) 
{ 
    mText.setOrigin(xOrig, yOrig); 
    mText.setColor(sf::Color::Green); 
} 

void TextElement::drawCurrent(sf::RenderTarget& target, sf::RenderStates states) const 
{ 
    std::cout << "TEXTELEMENT" << std::endl; 
    target.draw(mText, states); 
} 
void TextElement::updateCurrent(sf::Time dt) 
{ 
    //Do nothing, text doesn't need to update! 
} 

어떤 제안이 다음은 관련 파일은?

편집 : 나는 수 std 변수에 대한 모든 참조를 변경 한

1>------ Build started: Project: Byte, Configuration: Debug Win32 ------ 
1> TextWindow.cpp 
1>e:\gamedev\c++\byte\byte\textwindow.cpp(19): error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>' 
1>   with 
1>   [ 
1>    _Ty=Element 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\memory(2350) : see declaration of 'std::unique_ptr<_Ty>::unique_ptr' 
1>   with 
1>   [ 
1>    _Ty=Element 
1>   ] 
1> Generating Code... 
1> Compiling... 
1> Generating Code... 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

:: unique_ptr : :: 수 std 목록을 변경 unique_ptr 후, 나는 다음과 같은 오류가 발생합니다. 위에 게시 한 무엇, 그것은 mElements처럼 보이는

#include "TextWindow.hpp" 
#include "TextElement.hpp" 

#include <iostream> 

TextWindow::TextWindow(const TextureHolder& textures, const FontHolder& fonts, sf::Window& windows, Fonts::ID fontID, sf::String text) 
: mSprite(textures.get(Textures::WindowDefault)) 
, mHitpoints(10) 
, mWindow(windows) 
{ 
    sf::FloatRect bounds = mSprite.getLocalBounds(); 
    mSprite.setOrigin(bounds.width/2.f, bounds.height/2.f); 
    addElements(text, fonts.get(fontID)); 
} 

void TextWindow::addElements(sf::String text, sf::Font font) 
{ 
    std::unique_ptr<TextElement> e(new TextElement(text, font, 10, xPos, yPos, 10, 10)); 
    mElements.push_back(e); 
} 

void TextWindow::drawCurrent(sf::RenderTarget& target, sf::RenderStates states) const 
{ 
    target.draw(mSprite, states); 
    for(std::list<std::unique_ptr<Element>>::const_iterator iterator = mElements.begin(); iterator != mElements.end(); ++iterator) 
    { 
     //std::cout << "IN TEXTWINDOW PRINT ITERATOR" << std::endl; 
     (*iterator).get()->drawCurrent(target, states); 
    } 

} 

void TextWindow::updateCurrent(sf::Time dt) 
{ 
} 
+0

그래서 모든 반복마다 함수를 호출하려면 반복자가 필요합니까? –

+0

예. 그 방법은 목록에 저장된 것입니다. – Charsmud

답변

3

에서을 std::list<Element>이고, 나는 가상 기본 클래스 Element에서 TextElement 상속을 가정하고 있습니다 : 여기에 새로운 파일입니다.

이것은 작동하지 않습니다. mElementsslicing problem으로 알려져 있습니다.

전체 개체를 목록에 저장할 수 있도록 mElementsstd::list<unique_ptr<Element>> (또는 shared_ptr)으로 변경해야합니다.

+0

@Charsmud'mElements.push_back (std :: move (e)); '을 시도하십시오. –

+0

고마워, 그 오류가 수정되었습니다! 그러나 런타임에 Access violation reading location 오류가 발생합니다. 그러나 호출 할 메소드를 입력합니다. VS2010이 mlock.c의 _locktable로 보냅니다. – Charsmud

+0

@Charsmud : 다른 질문에 대한 문제인 것 같습니다. –

관련 문제