Mam taką klasę:
class car{
public:
string nazwisko;
string marka;
int rok;}
Muszę na bazie dołaczonego pliku, utworzyć obiekty do tej klasy, ale ich ilość ma być dowolna, więc chciałem do tego wykorzystać wektor, tylko problem w tym, że nie mam pojęcia jak to zrobić, bo nigdy go nie używałem. Mógłby mi to ktoś jakoś łopatologicznie wytłumaczyć?
https://en.cppreference.com/w/cpp/container/vector Masz na dole przykład kodu.
kq napisał(a):
https://en.cppreference.com/w/cpp/container/vector Masz na dole przykład kodu.
No tak, i na liczbach to ogarniam, ale nie wiem jak to zrobić z obiektem, który ma 3 atrybuty, różnych typów
Mam coś takiego, ale nie działa
Na liczbach ogarniasz, to świetnie. Wektor liczb powiększasz o kolejne poprzez dodanie... liczb! Dlaczego wektor aut chcesz powiększyć o coś, co nie jest autem?
kq napisał(a):
Na liczbach ogarniasz, to świetnie. Wektor liczb powiększasz o kolejne poprzez dodanie... liczb! Dlaczego wektor aut chcesz powiększyć o coś, co nie jest autem?
Dlatego proszę o ŁOPATOLOGICZNE wytłumaczenie, bo tego nie ogarniam
Jak chcesz mieć wektor obiektów jakiegoś typu, to tworzysz obiekt tego typu i wrzucasz go do wektora.
Ty nie próbujesz wrzucać car
, tylko file
.
Althorion napisał(a):
Jak chcesz mieć wektor obiektów jakiegoś typu, to tworzysz obiekt tego typu i wrzucasz go do wektora.
Ty nie próbujesz wrzucać
car
, tylkofile
.
Na początku próbowałem wrzucać car, ale dostawałem taką informację, jak w załączniku.
Błąd mówi, że nie starczyło Ci RAMu, żeby wrzucić auto do wektowa. Robisz coś bardzo dziwnego. Pokaż kod, który rzuca tym błędem.
stryku napisał(a):
Błąd mówi, że nie starczyło Ci RAMu, żeby wrzucić auto do wektowa. Robisz coś bardzo dziwnego. Pokaż kod, który rzuca tym błędem.
Jest wyżej na screenie
Czarniecki napisał(a):
kq napisał(a):
Na liczbach ogarniasz, to świetnie. Wektor liczb powiększasz o kolejne poprzez dodanie... liczb! Dlaczego wektor aut chcesz powiększyć o coś, co nie jest autem?
Dlatego proszę o ŁOPATOLOGICZNE wytłumaczenie, bo tego nie ogarniam
Nie umiem tego bardziej łopatologicznie wytłumaczyć. Umiesz dodać jabłko do jabłka, ale już pomarańczę próbujesz sumować z łopatą...
jeżeli nie używałeś wcześniej wektorów, to najpierw się z nimi zapoznaj, zrób kilka przykładów, np. TUTAJ. Jest też masa filmików na yt z tutorialami o wektorach. Później zrób swoją klasę Car i dodaj obiekty do wektora, TUTAJ jest podobny temat i w odpowiedzi masz kod. Z obsługą plików też masz problem, więc dodaj to na końcu. Jak nie zaczniesz pisać swojego kodu, to nic nie zrobisz
Możliwa rekonstrukcja wydarzeń:
OP miał pętlę postaci
while (file.good()) {
Auto.push_back(car);
}
Jako, że nic nie czytał z pliku, to ta pętla była efektywnie nieskończona. Wrzucał nowe samochody do wektora, i skończyła się pamięć, a jako rezultat pozostał std::bad_alloc
.
Kod:
#include <iostream>
using namespace std;
struct Car {
string model;
int year;
enum Color {
red = 0, green = 1, blue = 2
} color;
};
int main() {
while (cin.good()) {
Car car;
int iColor;
string model;
std::getline(cin, model);
if (model.empty()) break;
cin >> car.year;
cin >> iColor;
car.model = model;
car.color = static_cast<Car::Color>(iColor);
std::cin.ignore(256, '\n');
cout << "Car: model '" << car.model << "', year: " << car.year << ", color: " << car.color << endl;
}
return 0;
}
Dane wejściowe:
Porsze 911
1990
1
Maluszek
1981
2
Skoda Fabia
2018
0
Wynik:
Car: model 'Porsze 911', year: 1990, color: 1
Car: model 'Maluszek', year: 1981, color: 2
Car: model 'Skoda Fabia', year: 2018, color: 0
Dopasuj do swoich potrzeb.
To może przykład podobny jak wyżej. Pomijam kwestię nazewnictwa zmiennych, poza Auto - to można pomylić ze słowem kluczowym auto
- lepiej nie używać takich nazw. Pomijam kopiowanie obiektu, bo autor ma problem z drobnymi rzeczami. Ale niech ma i się bawi:
class Car {
public:
string nazwisko;
string marka;
int rok;
Car() : nazwisko(""), marka(""), rok(0) {}
};
Car wczytajObiekt(fstream& inputStream) {
Car car;
inputStream >> car.marka;
inputStream >> car.nazwisko;
inputStream >> car.rok;
return car;
}
int main(int argc, char *argv[]) {
cout << "Hello, World!" << endl;
vector<Car> cars;
fstream plik;
plik.open(filePath, ios::in);
if (!plik.is_open()) {
cerr << "Nie można otworzyć pliku" << endl;
return 1;
}
while (plik.good()) {
Car car;
car = wczytajObiekt(plik);
cars.push_back(car);
}
for (Car car: cars) {
cout << "Marka " << car.marka
<< ", nazwisko " << car.marka
<< ", rok " << car.rok
<< endl;
}
plik.close();
return 0;
}
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.