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

[cpp] wczytywanie obiektów tablicy vektora z pliku txt

Ostatnio zmodyfikowano 2014-07-22 21:42
Autor Wiadomość
Acarin1995
Temat założony przez niniejszego użytkownika
[cpp] wczytywanie obiektów tablicy vektora z pliku txt
» 2014-07-22 16:13:31
Witam chciałem zrobić program który wczytuje obiekty z pliku txt do bazy przedmiotów, a potem poprzez element tablicy je ustawia jako przedmiot założony. Lecz program nie chce działać. Ktoś ma jakiś pomysł?
C/C++
//main.cpp
#include "main.hpp"
#include "Character.hpp"
int main()
{
    CCharacter Player;
    CItem Items( "", 0, 0, 0 );
    Items.loadItems();
    Player.equipItems();
    cout << Player.p_rightHand->name;
    return 0;
}
//main.hpp
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
using namespace std;
//Character.hpp
#ifndef Character_hpp
#define Character_hpp
#include "Item.hpp"
class CCharacter
{
public:
    string name;
    int attackMin;
    int attackMax;
    int defence;
    vector < CItem *> backPack;
    CItem * p_rightHand;
    int equipItems();
};
#endif
//Character.cpp
#include "Character.hpp"
CCharacter::equipItems()
{
    p_rightHand = CItem.AllItems[ 1 ];
}
//Item.hpp
#ifndef Item_hpp
#define Item_hpp
#include "main.hpp"
class CItem
{
public:
    string name;
    int atackMin;
    int atackMax;
    int defence;
    vector < CItem *> AllItems;
    CItem( string name, int atackMin, int atackMax, int defence );
    int loadItems();
};
#endif
//Item.cpp
#include "Item.hpp"
CItem::CItem( string name_, int atackMin_, int atackMax_, int defence_ )
{
    name = name_;
    atackMin = atackMin_;
    atackMax = atackMax_;
    defence = defence_;
}
int CItem::loadItems()
{
    fstream itemBase;
    itemBase.open( "items.txt", ios::in );
    for( int i = 0; i < 5; ++i )
    {
        itemBase >> name >> atackMin >> atackMax >> defence;
        AllItems.push_back( new CItem( name, atackMin, atackMax, defence ) );
    }
    for( int i = 0; i < 5; ++i )
    {
        cout << AllItems[ i ]->name << endl;
    }
}
Gdy próbuje użyć tego kodu:
C/C++
//character.cpp
#include "Character.hpp"
int CCharacter::equipItems()
{
    CItem Item( "", 0, 0, 0 );
    p_rightHand = CItem.AllItems[ 1 ];
}

//items.txt
Sword 1 3 0
Dagger 2 2 0
Shield 0 0 1
Shirt 0 0 2
Helmet 0 0 1
Program się kompiluje lecz przestaje działać
P-114201
michal11
» 2014-07-22 17:57:38
C/C++
for( int i = 0; i < 5; ++i )
{
    itemBase >> name >> atackMin >> atackMax >> defence;
    AllItems.push_back( new CItem( name, atackMin, atackMax, defence ) );
}

Sprawdź czy pomoże jak stworzysz tymczasowe zmienne na wczytywanie danych z pliku.
P-114205
Moorfox
» 2014-07-22 20:39:18
Od takich rzeczy jest raczej debugger... Nie wiem czy to tutaj jest bledem ale probujesz sie dobrac do zmiennej poprzez klase
p_rightHand = CItem.AllItems[ 1 ];
,a powinienes wyslac jej instancje argumentem ewentualnie uzyc tej co utworzyles w funkcji. Po za tym funkcje ktora dales rozni sie od gornego kodu wiec ciezko ustalic mi co jest bledem
C/C++
int CCharacter::equipItems()
{
    CItem Item( "", 0, 0, 0 );
    Item.loadItems()
    p_rightHand = Item.AllItems[ 1 ];
}

lub

C/C++
int CCharacter::equipItems( CItem Item )
{
    Item.loadItems(); //ewentualnie wykonac to w mainie
    p_rightHand = Item.AllItems[ 1 ];
}


A zeby bylo to troche ladniej powinienes zmienic zmienna vector na private i dobierac sie do niej od funkcji publicznej ktora zwraca indeks przedmiotu
P-114213
unkn9wn
» 2014-07-22 21:42:33
przypisujesz nie statyczny obiekt w ogóle innej klasy
raczej chciałeś napisać

p_rightHand = backPack[ 1 ];

lecz to i tak nie zadziała.


dlaczego twoje metody load, equip itp zwracają int ? w sumie powinny zwracać, skoro tak zadeklarowałeś, a w zasadzie nic nie zwracają - błąd. Więc niech nic nie zwracają - czyli void
void equipItems();
a skoro chcesz coś tam sprawdzać w tych metodach, jakąkolwiek poprawność, użyj bool.

A tak w ogóle twój program nie będzie działał tak jak chcesz, gdyż

C/C++
CItem Items( "", 0, 0, 0 );
Items.loadItems();
Player.equipItems();

co to w ogóle robi? tworzysz oddzielny obiekt Items, gdzie załadowujesz dane z pliku, po czym kolejno tworzysz oddzielny obiekt klasy Player, który nic nie ma wspólnego z obiektem Items stworzonym powyżej

przecież dla gracza stworzyłeś backpack, więc to z niego powinieneś załadowywać te itemki (skoro CItem posiada już wszystkie itemki, co chcesz załadowywać do backpack'a który też jest vectorem? pomyśl, vector elementów gdzie każdy z elementów będzie miał vector elementów wszystkich itemków?

Dlatego projekt wydaje się pogmatwany, w klasie CItem opisujesz jeden item, dlaczego więc ta klasa posiada vector wszystkich itemków? Lepiej jak stworzysz ten vector w klasie Player i załadujesz wszystkie, wtedy po prostu mógłbyś dawać sobie np.:
p_rightHand = backpack[1];

lub jeżeli gra będzie bardziej rozbudowywana, powinieneś stworzyć jakiś Items manager. Najłatwiej zamiast vectora z mapą itemków i dać taki backpack dla gracza, wtedy w ogóle łatwo by się obsługiwało, np.:

p_rightHand = backpack.getItem("Sword of Mephisto");


PS.: i oczywiście enkapsulacja - zero
Przyzwyczajaj się ustawiać jako private
C/C++
private:
string name;
int atackMin;
int atackMax;
int defence;
public:
CItem();
// "mutatory" i "akcesory" -  get i set
// a także inne potrzebne[/cpp]
P-114217
« 1 »
  Strona 1 z 1