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! #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
#include "Header.h" cProstokat prostokat_1; cProstokat prostokat_2; cProstokat prostokat_3; int licznik = 0; vector < cProstokat > vec; vec.push_back( 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 ); } if( licznik == 1 ) vec.push_back( prostokat_3 ); ++licznik; glutPostRedisplay(); } break; case '+': { cout << "+" << endl; ++it; } break; case '-': { --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 ); glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); } void cScena::rysuj() { 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 ); 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; }
#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 ); scenka.init(); glutMainLoop(); system( "pause" ); return 0; }
|
|
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). |
|
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 |
|
Monika90 |
» 2016-03-19 18:11:41 vec.push_back( prostokat_1 );
|
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 vector < cProstokat > vec = { prostokat_1 };
wtedy push_back nie będzie potrzebne. |
|
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? ;) |
|
Monika90 |
» 2016-03-19 19:15:44 Stary kompilator. Zrób więc tak vector < cProstokat > vec( 1, prostokat_1 );
To znaczy: utwórz wektor z jednym elementem który jest kopią prostokat_1 |
|
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: 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 '+': { cout << "+" << endl; ++it; } break; case '-': { --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 ); } }
|
|
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. |
|
« 1 » |