Klasa ze skladnikami : tablica wskaznikow do funkcji oraz tablica string.
Ostatnio zmodyfikowano 2013-10-18 12:35
Haker123 Temat założony przez niniejszego użytkownika |
Klasa ze skladnikami : tablica wskaznikow do funkcji oraz tablica string. » 2013-10-17 17:44:27 Witam. Chcialem napisac sobie uniwersalna klase wypisujaca menu i uruchamiajaca odpowiednie funkcje ale mam problemy z tablica string[] ktora ma przechowywac wyslane napisy i wypisywac je w na liscie menu oraz tablica wskaznikow do funkcji zwracajacych typ void i nie przyjmujacych zadnych argumentow. Chcialem przez konstruktor wyslac dane do stringa oraz wielkosc tablicy w klacie cMenu, ta sama wielkosc miala wyb wykozystana do tablicy wskaznikow do funkcji. Kod jest narazie prowizorycznie bo nie moge przypisac danych do string a jak wybiore z menu wyjscie to wyskakuje blad : Run-Time Check Failure #2 - Stack around the variable 'menu' was corrupted.
Z tego co sie orientuje to ten blad powinien wyskoczyc jak chce cos przypisac poza tablica, tylko ze po wcisnieciu entera na pozycji "Wyjscie" program powinien sie zakonczyc bez uruchamiania funkcji (tablica wskaznikow do funkcji) a tam nic przeciez nie przypisuje. #include <iostream> #include <conio.h> #include <string> #include "kolko_i_krzyzyk\kolko_i_krzyzyk.h"
using namespace std;
class cMenu { const int wielkosc_tablic; int pozycja; bool prawda; void( * wFunkcja_menu[] )( void ); public: void wypisz(); cMenu( void( * wFunkcja[] )( void ), int const wielkosc ) : wielkosc_tablic( wielkosc ) , pozycja( 0 ) , prawda( true ) { wFunkcja_menu[ wielkosc_tablic ]; for( int i = 0; i < wielkosc_tablic; i++ ) { wFunkcja_menu[ i ] = wFunkcja[ i ]; } } };
void cMenu::wypisz() { while( prawda ) { cout << string( 26, '*' ) << "\n****Program treningowy****\n" << "*Poruszamy sie strzalkami*\n" << "**A zatwierdzamy ENTEREM**\n" << string( 26, '*' ) << "\n\n"; switch( pozycja ) { case 0: cout << "Kolko i krzyzyk <====\n" << "Labirynt \n" << "Wyjscie \n"; break; case 1: cout << "Kolko i krzyzyk \n" << "Labirynt <====\n" << "Wyjscie \n"; break; case 2: cout << "Kolko i krzyzyk \n" << "Labirynt \n" << "Wyjscie <====\n"; break; } int znak = getch(); switch( znak ) { case 224: if( kbhit() ) { znak = getch(); switch( znak ) { case 72: pozycja--; if( pozycja < 0 ) pozycja = 0; break; case 80: pozycja++; if( pozycja > 2 ) pozycja = 2; break; default: break; } } break; case 13: if( pozycja == 2 ) { prawda = false; return; } if( pozycja < 2 && pozycja >= 0 ) { system( "cls" ); wFunkcja_menu[ pozycja ](); } break; default: break; } system( "cls" ); } }
int main() { int const wielkosc = 5; string nazwy[ 5 ]; void( * wFunkcja_menu[ wielkosc ] )( void ); wFunkcja_menu[ 0 ] = Gra; cMenu menu( wFunkcja_menu, wielkosc ); menu.wypisz(); return 0; } Bede wdzieczny za pomoc. |
|
pekfos |
» 2013-10-17 18:06:42 wFunkcja_menu[ wielkosc_tablic ];
Co to? |
|
Haker123 Temat założony przez niniejszego użytkownika |
» 2013-10-17 18:10:12 Kombinowalem jak nadac wielkosc tej tablicy wskaznikow do funkcji, i dopiero po takim zapisie normalnie mi wyswietlalo funkcje.
Edit:
A tablice string to probowalem przez wskaznik , przez wartosc , przez new i nie wychodzilo mi to. Cos robie zle ale nie wiem co. |
|
pekfos |
» 2013-10-17 18:12:15 Dynamicznie zaalokuj tyle wskaźników, ile potrzebujesz. |
|
Haker123 Temat założony przez niniejszego użytkownika |
» 2013-10-17 18:17:26 Jak robilem przez new przy tablicy wskaznikow to wyskakiwal mi blad, niestety nie pamietam dokladnie ale znak = byl podkreslony na czerwono i pisalo cos ze on niepasuje binarnie czy jakos tak. |
|
Monika90 |
» 2013-10-17 19:26:10 Jakiego kompilatora używasz? class cMenu { void( * wFunkcja_menu[] )( void ); };
Powyższa deklaracja tablicy jest nieprawidłowa. Niestatyczna tablica w klasie nie może nie mieć podanego rozmiaru. |
|
Haker123 Temat założony przez niniejszego użytkownika |
» 2013-10-17 19:51:19 Kozystam z Microsoft Visual C++ 2010 Express. Jak narazie to nie wiem jak mam rozwiazac ten problem bo nie umiem narazie dobrze kozystac ze wskaznikow na funkcje, a przy tym problemie wydaly mi sie najlepszym wyjsciem. Wiem ze prosze o wiele ale czy moze ktos napisac mi jak powinna wygladac ta klasa?? Bo juz 2 dzien siedze i staram sie cos wymyslec z pomoca internetu. |
|
Monika90 |
» 2013-10-17 20:10:55 Może tak: class Menu { struct Pozycja { std::string nazwa; std::function < void() > akcja; }; std::vector < Pozycja > pozycje; };
Jak kompilator nie ma std::function, to zastąp ją przez boost::function, albo std::tr1::function. |
|
« 1 » 2 |