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

Dodawanie obiektów do vectora

Ostatnio zmodyfikowano 2016-03-20 00:17
Autor Wiadomość
Garniturek
Temat założony przez niniejszego użytkownika
Dodawanie obiektów do vectora
» 2016-03-19 14:16:35
Witam mam problem z dodaniem obiektu do vectora, nie rozumiem skąd te errory:
error C2143: syntax error : missing ';' before '.'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C2371: 'vec' : redefinition; different basic types
Pomocy!
C/C++
#ifndef Header_hpp
#define Header_hpp
#include <iostream>
#include <vector>
#include "glut.h"
#include "math.h"
using namespace std;
class cProstokat
{
    float x, y;
    float a, b;
    float kat;
    float R, G, B;
public:
    friend class cScena;
    void rysuj();
    cProstokat();
    cProstokat( float x1, float y1, float a1, float b1, float kat1, float R1, float G1, float B1 );
};
class cScena
{
   
public:
    void rysuj();
    void init();
    void klawisz( char key, float x, float y );
};
void rysuj();
void klawisz( unsigned char k );
#endif
C/C++
#include "Header.h"
cProstokat prostokat_1;
cProstokat prostokat_2;
cProstokat prostokat_3;
int licznik = 0;
vector < cProstokat > vec;
vec.push_back( prostokat_1 ); //ERROR
auto it = vec.begin();

void cScena::klawisz( char key, float x_d, float y_d )
{
    switch( key ) {
    case 'n':
        {
            if( licznik == 0 )
            {
                vec.push_back( prostokat_2 );
               
            }
            if( licznik == 1 )
                 vec.push_back( prostokat_3 );
           
            ++licznik;
            glutPostRedisplay();
        } break;
    case '+': //przechodzi na kolejny obiekt
        {
            cout << "+" << endl;
            ++it;
        } break;
    case '-': //wraca do poprzedniego obiektu
        {
            --it;
        } break;
    case '1':
        it->x +=.1;
        it->y +=.1;
        glutPostRedisplay();
        break;
    case '2':
        it->x -=.1;
        it->y -=.1;
        glutPostRedisplay();
        break;
    case 'x':
    case 'X':
        exit( 0 );
       
    }
}
void cScena::init()
{
    cout << "TLO" << endl;
    glClearColor( 0.0, 0.0, 0.0, 0.0 );
    glColor3f( 1.0, 1.0, 1.0 );
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    glOrtho( - 1.0, 1.0, - 1.0, 1.0, - 1.0, 1.0 ); //stawia kamere na scene
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
}
void cScena::rysuj()
{
    //petla ktora iteruje po wsyzstkich elementach potem patrz void display()
    for( auto v = vec.begin(); v != vec.end(); ++v )
    {
        v->rysuj();
    }
}
void cProstokat::rysuj()
{
    glClear( GL_COLOR_BUFFER_BIT );
    glPushMatrix();
    glTranslatef( this->x, this->y, 0 );
    // glTranslatef(x,y,0);
    //glRotatef(kat,0,0,1); rotacja w okolo osi z
    glBegin( GL_POLYGON );
    glVertex2f( - 0.5, - 0.5 );
    glVertex2f( - 0.5, 0.5 );
    glVertex2f( 0.5, 0.5 );
    glVertex2f( 0.5, - 0.5 );
    glEnd();
    glPopMatrix();
    glFlush();
}
cProstokat::cProstokat()
{
    x = 0.0, y = 0.0;
    a = 1.0, b = 1.0;
    kat = 1.0;
    R = 1.0, G = 1.0, B = 1.0;
}
cProstokat::cProstokat( float x1, float y1, float a1, float b1, float kat1, float R1, float G1, float B1 )
{
    x = x1, y = y1;
    a = a1, b = b1;
    kat = kat1;
    R = R1, G = G1, B = B1;
}
C/C++
#include "Header.h"
cScena scenka;
void rysuj()
{
    scenka.rysuj();
}
void klawisz( unsigned char k, int x, int y )
{
    scenka.klawisz( k, x, y );
}
int main( int argc, char * argv[] )
{
    glutInit( & argc, argv );
    glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB );
    glutInitWindowSize( 500, 500 );
    glutInitWindowPosition( 0, 0 );
    glutCreateWindow( "simple" );
    glutDisplayFunc( rysuj );
    glutKeyboardFunc( klawisz ); // key musi byc funkcja, nie moze byc metoda
    scenka.init();
    glutMainLoop();
    system( "pause" );
    return 0;
}
P-146202
michal11
» 2016-03-19 16:04:23
Problem jest w kodzie gdzieś wcześniej, prawdopodobnie drugi raz zadeklarowałeś vec (tak przynajmniej wynika z podanych błędów).
P-146210
Garniturek
Temat założony przez niniejszego użytkownika
» 2016-03-19 17:48:55
Nigdzie nie deklarowałem tego vectora. W pierwszym poście wkleiłem cały kod. Proszę o pomoc
P-146219
Monika90
» 2016-03-19 18:11:41
C/C++
vec.push_back( prostokat_1 ); //ERROR
Widzisz, to jest instrukcja. Instrukcje mogą być tylko wewnątrz funkcji.

Jeżeli chcesz, możesz zadeklarować ten wektor, tak by od razu zawierał jeden lub więcej elemntów
C/C++
vector < cProstokat > vec = { prostokat_1 };

wtedy push_back nie będzie potrzebne.
P-146223
Garniturek
Temat założony przez niniejszego użytkownika
» 2016-03-19 18:44:30
Oh, nie wiedziałem, że tak nie można. Dzięki :)
Jak zrobię tak jak Pani podała, to mam taki error: error C2552: 'vec' : non-aggregates cannot be initialized with initializer list
Mam Microsoft visual 2012. Można to zrobić jakoś inaczej? ;)
P-146225
Monika90
» 2016-03-19 19:15:44
Stary kompilator. Zrób więc tak

C/C++
vector < cProstokat > vec( 1, prostokat_1 );

To znaczy: utwórz wektor z jednym elementem który jest kopią prostokat_1
P-146232
Garniturek
Temat założony przez niniejszego użytkownika
» 2016-03-19 20:11:54
Mam kolejny problem, kiedy klikam 'n', czyli chce dodać do vectora kolejny obiekt i go pokazać na ekranie również to mi wyskakuje error: vector iterator not incrementable. Pomocy! Poprawiłem trochę te funkcje, teraz wygląda tak:
C/C++
cProstokat prostokat_1;
cProstokat prostokat_2;
cProstokat prostokat_3;
int licznik = 0;
vector < cProstokat > vec( 1, prostokat_1 );
auto it = vec.begin();
void cScena::klawisz( char key, float x_d, float y_d )
{
    switch( key ) {
    case 'n':
        {
            if( licznik == 0 )
            {
                vec.push_back( prostokat_2 );
                ++it;
            }
            if( licznik == 1 )
            {
                vec.push_back( prostokat_3 );
                ++it;
            }
            ++licznik;
            glutPostRedisplay();
        } break;
    case '+': //przechodzi na kolejny obiekt
        {
            cout << "+" << endl;
            ++it;
        } break;
    case '-': //wraca do poprzedniego obiektu
        {
            --it;
        } break;
    case '1':
        it->x +=.1;
        it->y +=.1;
        glutPostRedisplay();
        break;
    case '2':
        it->x -=.1;
        it->y -=.1;
        glutPostRedisplay();
        break;
    case 'x':
    case 'X':
        exit( 0 );
       
    }
}
P-146240
Kajteusz
» 2016-03-20 00:17:16
Nie wiem co chcesz osiągnąć tą funkcją, ale jeden z Twoich błędów jest to, że modyfikujesz iterator po zmianie kontenera (dodaniu obiektu). Wg specyfikacji C++ wszystkie iteratory i referencje są nieważne po zmianie rozmiaru kontenera.
P-146251
« 1 »
  Strona 1 z 1