tworzenie obiektu klasy o nazwie ze stringa

0

Witam

Jak zrobić coś takiego że tworzę sobie np. klasę samochód, tworzę obiekt np. fiat, ford, etc. i w programie jest opcja dodania obiektu. no i user podaje nazwę np. mercedes i ENTER. I jak zrobić żeby powstał obiekt w danej klasie o nazwie mercedes? Bo chyba trzeba to najpierw spisać do jakiegoś stringa, tak? A potem co?

Jest jakaś funkcja, która tworzy obiekt o nazwie z jakiejś zmiennej (sting)?

0

nazwy są tylko dla wygody programisty,procesor posługuje się adresami danych.Nie możesz w trakcie działania programu definiować nowych zmiennych określonych nazwą,możesz to uczynić jedynie przez tworzenie nowych obiektów w pamięci operatorem new.

Jakimś rozwiązaniem twojego dylematu może być:

class YaClass
{
public:
   string name;
}

i tym name będziesz sobie trzymał te mercedesy itd.

0

Nie utworzysz obiektu o nazwie podanej przez użytkownika. Nazwy obiektów ustalasz TY, możesz sobie zadeklarować tablicę (lub vector) i mieć w klasie składową typu string, która będzie przechowywała informację jaki model samochodu stworzył użytkownik programu np:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

class samochod
{
public:
    string model;
};

int main()
{
    samochod tablica[10];
    cin >> tablica[0].model; // tutaj użytkownik podaje model jaki chce utworzyć

    cout << "\nModel ktory utworzyl uzytkownik to: " << tablica[0].model << endl;

    system("pause");
    return 0;
}
1
std::map<std::string, TwojaKlasaSamochodu> garaz;

garaz["Mercedes"]= TwojaKlasaSamochodu("Mercedes", 233, 12.3);
garaz["Fiat"]= TwojaKlasaSamochodu("Mercedes", 90, 5.3);
...
garaz["Mercedes"].zatankuj();
0
MarekR22 napisał(a)
std::map<std::string, TwojaKlasaSamochodu> garaz;

garaz["Mercedes"]= TwojaKlasaSamochodu("Mercedes", 233, 12.3);
garaz["Fiat"]= TwojaKlasaSamochodu("Mercedes", 90, 5.3);
...
garaz["Mercedes"].zatankuj();

Próbowałem ten sposób ale nie chce działać.

najpierw zrobiłem tak:
std::map<std::string, TwojaKlasaSamochodu> garaz;
garaz["Mercedes"]= TwojaKlasaSamochodu("Mercedes", 233, 12.3);
garaz["Fiat"]= TwojaKlasaSamochodu("Mercedes", 90, 5.3);

nie działało to spróbowałem tak:
std::map<std::string, samochod> garaz;
garaz["Mercedes"];
garaz["Fiat"];

też nie działało.
w tej linii std::map... wywala błędy:
'map' : is not a member of 'std'
syntax error : missing ';' before '<'
missing type specifier - int assumed. Note: C++ does not support default-int

no i przy każdym użyciu garaz wyrzuca
'garaz' : undeclared identifier

Czy żeby to działało trzeba dać jakiegoś #include ? Program robię w Visualu C++ 2008 express.

0

Nie dodałeś prawdopodobnie biblioteki

#include <map>
0

dodałem ale wywala wtedy jeszcze dodatkowo
'#include <map>': skipped when looking for precompiled header use

0

Piszesz w DevC++?

0

nie. W visual c++ 2008 express.

0

'#include <map>': skipped when looking for precompiled header use

masz włączoną opcję „precompiled header”. to dobra rzecz, ale oznacza tyle, że:
· program musi inkludować plik stdafx.h
· swoje include dodawaj do stdafx.h a nie bezpośrednio

0

Ale to jak mam dodać do stdafx? w pliku dopisać? ale inne include, które dodałem działają bez problemu:

#include "stdafx.h"
#include <iostream>
#include <math.h> 
#include <stdlib.h>
#include <string>
#include <conio.h>
#include <windows.h>
using namespace std;

I nie wywala żadnych błędów. A jak tylko dodam ten <map> to j.w.

0

ale to jak mam dodać do stdafx?
normalnie.

wywal z pliku .cpp nagłówki

#include "stdafx.h"
using namespace std;

i przenieś je właśnie do stdafx.h

poza tym zamiast <math.h> i <stdlib.h> użyj <cmath> i <cstdlib>

0

Udało mi się zrobić żeby nie wywalało include<map> (przesunąłem po prostu poniżej stdafx :D ). Ale coś ten sposób nie chce działać, albo ja nie wiem jak to zrobić.

powiedzmy, że jest tak:

class samochod
{
public:
string typ; //to tak na przykład
}

class mercedes : public samochod
{
string nazwa;
int silnik;
}

i teraz tworzę nowy obiekt
mercedes vito;
vito.nazwa = "vito";
vito.silnik = 2;

tak wygląda moja struktura. Jak mam użyć tego sposobu (na tym przykładzie) żeby mi stworzyło nowy obiekt klasy "mercedes"? co gdzie trzeba wpisać? I co to za liczby w tych nawiasach?
Mam mniej więcej tak:

std::map<std::string, mercedes> nowy;

nowy["jakistammodel"]=mercedes("jakistammodel", 233, 12.3);
nowy["jakistammodel"].nazwa="Jakistammodel";

jak zrobię z tymi liczbami to wywala:
'main::mercedes::mercedes' : no overloaded function takes 3 arguments
jak usunę liczby to wywala:
'<function-style-cast>' : cannot convert from 'const char [9]' to 'main::mercedes'

Nie bardzo wiem jak ten sposób działa. Ja rozumiem to tak że powinien powstać obiekt
mercedes jakistammodel;
i potem wpisanie jakiejś wartości do zmiennej klasy.
jakistammodel="Jakistammodel";

Jak usunę w ogóle tą część
=mercedes("jakistammodel", 233, 12.3)
,że zostanie samo
nowy["jakistammodel"];
to wtedy się kompiluje ale działać nie działa bo próba wypisania
cout << jakistammodel.nazwa
wywala błąd że jakistammodel jest nie zdefiniowany

Co robię źle?
Jak dokładnie na tym podanym przykładzie zrobić aby powstał nowy obiekt klasy mercedes o nazwie np. "AMG"? Jakby był jeden działający przykład to bym rozkminił całą ideę wtedy.

edit: Azarien, a czy to ma jakieś znaczenie w działaniu z tymi include w stdafx czy po prostu estetyka? Bo jeśli estetyka to niech już będzie jak jest. Błędów już mi z tym nie wywala i w tej kwestii jest wszystko ok. A estetyka mnie na razie nie interesuje.

0
Curry_ napisał(a)

Mam mniej więcej tak:

std::map<std::string, mercedes> nowy;

nowy["jakistammodel"]=mercedes("jakistammodel", 233, 12.3);
nowy["jakistammodel"].nazwa="Jakistammodel";

jak zrobię z tymi liczbami to wywala:
'main::mercedes::mercedes' : no overloaded function takes 3 arguments
jak usunę liczby to wywala:
'<function-style-cast>' : cannot convert from 'const char [9]' to 'main::mercedes'

Bo "mercedes("jakistammodel", 233, 12.3)" oznacza wywołanie konstruktora, którego nie napisałeś.

1 użytkowników online, w tym zalogowanych: 0, gości: 1