pasierdamian Temat założony przez niniejszego użytkownika |
Kontener Vector i "vector subscript out of range" » 2015-08-16 21:45:55 Witam, mam problem z prawidlowym dzialaniem kontenera vector, nie mam zadnych błedów przy building jednak podczas debugowania błędy wyskakuja . #include <iostream> #include <vector> #include <SFML/Graphics.hpp> #include "Ball.h" #include "Line.h" //#include "TextBall.h" using namespace std; using namespace sf;
int main() { RenderWindow win(VideoMode(800, 600), L"Rozdział 1"); Clock stoper; Font font; font.loadFromFile("arial.ttf"); float ySpeed = -50; float xSpeed = -100; vector<Ball> ball;
for (int i = 0; i < 3; i++) { ball[i].SetPozition(100+10*i, 50*10*i); ball[i].Fil(Color::Yellow); ball[i].Promien(15+2*i); } Ball CircleOne(win); Line linia1(win); linia1.sie(600, 500); linia1.position(20, 20); linia1.thiness(2); Text text; text.setFont(font); text.setString("1"); text.setCharacterSize(15); text.setColor(sf::Color::Black);
CircleOne.SetPozition(100, 100); // CircleOne.SetOutlineColor(Color::Red); CircleOne.Fil(Color::Yellow); CircleOne.Promien(15); // CircleOne.thinesS(); while (win.isOpen()) { win.clear(Color::White); Event e; while (win.pollEvent(e)) { if (e.type == Event::Closed) win.close(); } float xposition = CircleOne.GetPosition().x + CircleOne.radius()*2/3 ; float yposition = CircleOne.GetPosition().y + CircleOne.radius()/4; text.setPosition(xposition, yposition);
auto dt = stoper.restart().asSeconds(); CircleOne.Move(xSpeed *dt , ySpeed * dt); for (int i = 0; i, 3; i++) { ball[i].Move(xSpeed *dt, ySpeed * dt); } text.move(xSpeed *dt, ySpeed * dt); linia1.draw(); for (int i = 0; i, 3; i++) { ball[i].Draw(); } CircleOne.Draw(); win.draw(text); for (int i = 0; i, 3; i++) { int positionY = ball[i].GetPosition().y; if (positionY <= 20){ ySpeed = -ySpeed; } if (positionY >= 520.0 - 2 * ball[i].radius()){ ySpeed = -ySpeed; } int positionX = ball[i].GetPosition().x; if (positionX <= 20){ xSpeed = -xSpeed; } if (positionX >= 620.0 - 2 * ball[i].radius()){ xSpeed = -xSpeed; }
} int positionY = CircleOne.GetPosition().y; if (positionY <= 20){ ySpeed = -ySpeed; } if (positionY >= 520.0-2*CircleOne.radius()){ ySpeed = -ySpeed; } int positionX = CircleOne.GetPosition().x; if (positionX <= 20){ xSpeed = -xSpeed; } if (positionX >= 620.0-2*CircleOne.radius()){xSpeed = -xSpeed; } win.display(); } }
|
|
killjoy |
» 2015-08-16 21:55:28 Odwołujesz się do pustego vectora, stąd "out of range". Wrzuć coś do niego, albo zarezerwuj mu jakąś początkową wielkość. |
|
pasierdamian Temat założony przez niniejszego użytkownika |
» 2015-08-16 22:16:30 Dzieki za szybką odpowiedz. Gdy próbuje nadać poczatkową wartosc vector<Ball> ball(4); otrzymuje błąd Error 8 error LNK2019: unresolved external symbol "public: __thiscall Ball::Ball(void)" (??0Ball@@QAE@XZ) referenced in function "public: void __thiscall std::allocator<class Ball>::construct(class Ball *)" (?construct@?$allocator@VBall@@@std@@QAEXPAVBall@@@Z) C:\Users\Damian\documents\visual studio 2013\Projects\Lotto\Lotto\main.obj Lotto
Nie wime za brdzo jak dodać element klasy Ball do vectora ball ball.push_back(Ball pilka ) nie działa |
|
pekfos |
» 2015-08-16 22:22:10 Masz zdefiniowany konstruktor domyślny w Ball? ball.push_back(Ball pilka ) nie działa |
|
|
pasierdamian Temat założony przez niniejszego użytkownika |
» 2015-08-16 22:27:48 Jak mogę to zrobić w petli abym nie dodawał 4 osobnych push-backów?
jesli nawet dodam do vectora nowy obiekt klasy Ball, to czy wplywa mi to na na wywolania ball ?
|
|
killjoy |
» 2015-08-16 22:40:14 while( ball.size() < 4 ) ball.push_back( Ball() );
O ile masz zdefiniowany konstruktor domyślny dla klasy ball. (Błędy wskazują na to, że nie masz) A jeżeli kompilator obsługuje C++11 to użyj emplace_back(). |
|
pasierdamian Temat założony przez niniejszego użytkownika |
» 2015-08-16 22:49:23 Faktycznie nie mam Konstruktora domyslnego, ale gdy chce go stworzyc wyskakuje mi błąd error C2758: 'Ball::Render' : a member of reference type must be initialized Moj kod klasy Ball #include <SFML/Graphics.hpp> #include <SFML/Window.hpp> #include <iostream>
using namespace std; using namespace sf;
class Ball { public: Ball(RenderWindow&); Ball(); void SetPozition(int, int); void SetOutlineColor(Color); void Draw(); void Fil(Color); void thinesS(); void Promien(float); void Move(float, float); const sf::Vector2f& Ball::GetPosition() const; float radius();
private: private: CircleShape Circley; RenderWindow& Render;
};
Ball::Ball(sf::RenderWindow& app) : Render(app) { }
Ball::Ball() {
}
void Ball::SetPozition(int x, int y) { Circley.setPosition(x, y); }
void Ball::SetOutlineColor(Color kolor) { Circley.setOutlineColor(kolor); } void Ball::thinesS() { Circley.setOutlineThickness(5); } void Ball::Fil(Color kolor) { Circley.setFillColor(kolor); } void Ball::Draw(){ Render.draw(Circley); } void Ball::Promien(float radius) { Circley.setRadius(radius); }
void Ball::Move(float x, float y) { Circley.move(x, y); } const sf::Vector2f& Ball::GetPosition() const { return Circley.getPosition(); } float Ball::radius() { return Circley.getRadius(); }
|
|
killjoy |
» 2015-08-16 23:04:44 Referencja musi być zainicjalizowana, dlatego dostajesz błędy. Najprościej będzie kiedy wywalisz konstruktor domyślny i zrobisz tak: while( ball.size() < 4 ) ball.push_back( Ball( win ) );
|
|
« 1 » 2 3 |