Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Kontener Vector i "vector subscript out of range"

Ostatnio zmodyfikowano 2015-08-17 22:44
Autor Wiadomość
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();
}
}
P-136389
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ść.
P-136391
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
P-136393
pekfos
» 2015-08-16 22:22:10
Masz zdefiniowany konstruktor domyślny w Ball?

ball.push_back(Ball pilka )
nie działa
C/C++
ball.push_back( pilka )
P-136395
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 ?
P-136396
killjoy
» 2015-08-16 22:40:14
C/C++
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().
P-136397
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();
}
P-136399
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:
C/C++
while( ball.size() < 4 )
     ball.push_back( Ball( win ) );

P-136400
« 1 » 2 3
  Strona 1 z 3 Następna strona