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

[Vector i klasa] Jak wywołać funkcję?

Ostatnio zmodyfikowano 2012-06-08 10:05
Autor Wiadomość
xevuel
» 2012-06-07 22:12:59
W zależności od sposobu wywołania wywołuje odpowiedni konstruktor.

Wywołanie
Foo var1( 10, 20, 4 * 2 );
wywoła konstruktor
Foo::Foo( int a, int b, int c );

a wywołanie
Foo var1;
wywoła konstruktor
Foo::Foo();
P-58045
Unlimited
Temat założony przez niniejszego użytkownika
» 2012-06-07 22:16:49
Aha. Dzięki Wam wielkie. Kolego z nickiem Admixior zrozumiałem Cię ale nie rozumiem dlaczego tutaj mi wychodzi że samochód może mieć swoje samochody (może lepiej powiedzieć podsamochody?). Jakoś program działa mi dobrze i jestem zadowolony z jego pracy. vector używam aby mieć dynamiczną tablicę abym nie miał z góry określonej ilości miejsc w tym wypadku na samochody.

xevuel, dzięki wielkie za wytłumaczenie. Już jestem o tyle mądrzejszy dzięki Tobie.
P-58046
xevuel
» 2012-06-07 22:39:27
Jemu chodziło o to, że zamiast dynamicznej tablicy wpisanej w klasę (tworzonej przy wywołaniu
Foo zmienna;
), ten vector lepiej było by utworzyć w funkcji main() jako
vector < Foo > zmienne;
. Nie ma za dużej różnicy, ale każde dodatkowe utworzenie zmiennej typu Foo w tym przypadku będzie wprowadzało kolejny wektor, co zmniejszy czytelność kodu (i co prawdopodobnie nie będzie zamierzone).

A z mnożeniem samochodów chodziło o to, że wywołasz sobie
samochody zmienna
, i zmienna będzie przechowywała wektor samochod. Po wywołaniu
zmienna.samochod.push_back()
zostanie wywołany jeszcze raz konstruktor danej klasy, tak więc do wektora samochod zostanie przypisana nowa klasa (typu samochody), która też przecież zawiera ten wektor. I tak w koło macieju...
P-58048
Unlimited
Temat założony przez niniejszego użytkownika
» 2012-06-07 22:49:16
Jeśli przeniosę
vector < samochody > samochod;
 do sekcji int main() to wtedy we wszystkich funkcjach przestanie być widoczna zmienna samochod. A co do tego drugiego to nie wiem czy to dobrze rozumiem ale po co miałbym robić taki zapis jak podałeś skoro wszystko mam na funkcjach a tam chyba nie ma możliwości aby taki zapis się pojawił a w sekcji main() nie puści kompilator bo nazwa samochody nie będzie widoczna. Mimo wszystko się nie wymądrzam bo widocznie jeszcze za mało wiem więc może przyjdzie za niedługo czas w którym będę wiedział o co dokładnie chodzi. Mimo wszystko dzięki Wam wielkie za pomoc.

Co do tego pierwszego są i tego plusy bo można by zrobić tak że będzie np:
C/C++
Foo audi;
Foo vw;
Foo skoda;
i po tym będą posortowane samochody wg. marki. Dodać tylko menu które umożliwi dodanie samochodu do odpowiedniej marki i chyba dobrze by wtedy to działało.
P-58050
xevuel
» 2012-06-08 08:16:01
Oczywiście, wszystko zależy od programisty. Im więcej jednak zrobisz "nieczytelnych" zapisów, tym większa szansa, że gdzieś popełnisz błąd. Równie dobrze wektor
vector < samochody > samochod;
 można zrobić jako zmienną globalną. Ale to, że klasa udostępnia możliwość powstania zapisu, o którym wspomniałem we wcześniejszym poście, powoduje zwiększone ryzyko błędu, który może być trudno wychwycić.

Ja np. wolałbym mieć taki zapis w funkcji main():
C/C++
vector < samochod > Audi;
vector < samochod > Opel;
vector < samochod > Fiat;
niż:
C/C++
samochod Audi;
samochod Opel;
samochod Fiat;
bo od razu widać, że to pierwsze to tablica. W drugim przypadku trzeba zajrzeć do klasy, aby się o tym przekonać.
Ale wszystko zależy od Ciebie, od Twojej koncepcji.

Tutaj nie chodzi o to, że za mało wiesz, tylko o to, że tworzysz kod, który nie będzie zbyt czytelny po dłuższej przerwie w pisaniu danego projektu, albo w razie przejęcia kodu przez kogoś innego :)
P-58062
Unlimited
Temat założony przez niniejszego użytkownika
» 2012-06-08 09:08:36
Też bym tak wolał ale gdy dam vector <samochody> samochod do main() to wtedy stracę możliwość posiadania funkcji tak jak jest w tym wypadku:
C/C++
#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>
using namespace std;

class samochody
{
public:
    string marka;
    string model;
    string paliwo;
    int pojemnosc;
    int rok;
    samochody( string xmarka, string xmodel, string xpaliwo, int xpojemnosc, int xrok );
};

samochody::samochody( string xmarka, string xmodel, string xpaliwo, int xpojemnosc, int xrok )
    : marka( xmarka )
    , model( xmodel )
    , paliwo( xpaliwo )
    , pojemnosc( xpojemnosc )
    , rok( xrok )
{
}

int main()
{
    string Xmarka, Xmodel, Xpaliwo;
    int wybor, x, Xpojemnosc, Xrok;
    vector < samochody > samochod;
   
    do
    {
        system( "cls" );
        cout << "[1] Wyswietl samochody" << endl;
        cout << "[2] Dodaj nowy samochod" << endl;
        cout << "[3] Edytuj samochod" << endl;
        cout << "[4] Usun wpis samochodu" << endl;
        cout << "[0] Zakoncz" << endl << endl;
        cout << "Twoj wybor: ";
        cin >> wybor;
       
        switch( wybor )
        {
        case 1:
            {
                for( int i = 0; i < samochod.size(); i++ )
                {
                    cout << endl;
                    cout << i + 1 << ". Marka: " << samochod[ i ].marka << endl;
                    cout << "   Model: " << samochod[ i ].model << endl;
                    cout << "   Paliwo: " << samochod[ i ].paliwo << endl;
                    cout << "   Pojemnosc: " << samochod[ i ].pojemnosc << endl;
                    cout << "   Rok: " << samochod[ i ].rok << endl;
                }
                cout << endl;
                system( "pause" );
                break;
            }
        case 2:
            {
                cout << endl;
                cout << "Podaj marke: ";
                cin >> Xmarka;
                cout << "Podaj model: ";
                cin >> Xmodel;
                cout << "Podaj paliwo: ";
                cin >> Xpaliwo;
                cout << "Podaj pojemnosc: ";
                cin >> Xpojemnosc;
                cout << "Podaj rok: ";
                cin >> Xrok;
                samochod.push_back( samochody( Xmodel, Xmarka, Xpaliwo, Xpojemnosc, Xrok ) );
                cout << endl << "Dodano pomyslnie!" << endl << endl;
                system( "pause" );
                break;
            }
        case 3:
            {
                cout << endl;
                cout << "Podaj index pojazdu: ";
                cin >> x;
                cout << endl << "Aktualne zestawienie dla indeksu nr " << x << ":" << endl;
                cout << x << ". Marka: " << samochod[ x - 1 ].marka << endl;
                cout << "   Model: " << samochod[ x - 1 ].model << endl;
                cout << "   Paliwo: " << samochod[ x - 1 ].paliwo << endl;
                cout << "   Pojemnosc: " << samochod[ x - 1 ].pojemnosc << endl;
                cout << "   Rok: " << samochod[ x - 1 ].rok << endl;
                cout << endl << "Podaj nowe zestawienie: " << endl;
                cout << x << ". Marka: ";
                cin >> samochod[ x - 1 ].marka;
                cout << "   Model: ";
                cin >> samochod[ x - 1 ].model;
                cout << "   Paliwo: ";
                cin >> samochod[ x - 1 ].paliwo;
                cout << "   Pojemnosc: ";
                cin >> samochod[ x - 1 ].pojemnosc;
                cout << "   Rok: ";
                cin >> samochod[ x - 1 ].rok;
                cout << endl << "Zedytowano pomyslnie!" << endl << endl;
                system( "pause" );
                break;
            }
        case 4:
            {
                cout << endl;
                cout << "Podaj index pojazdu: ";
                cin >> x;
                samochod.erase( samochod.begin() + x - 1 );
                cout << endl << "Usunieto pomyslnie!" << endl << endl;
                system( "pause" );
                break;
            }
        }
    } while( wybor != 0 );
   
    return 0;
}
A wysyłanie przez referencję do funkcji to nie wiem czy się vectora da (nie próbowałem), a jak nie wyślę to nie będzie widoczny dla funkcji. Chcę pisać obiektowo i tego się trzymać.
P-58069
xevuel
» 2012-06-08 09:10:31
Nie wiem o jaką funkcję ci chodzi, ale przecież zawsze można ten wektor przekazać jako argument do innej.

A wysyłanie przez referencję do funkcji to nie wiem czy się vectora da (nie próbowałem), a jak nie wyślę to nie będzie widoczny dla funkcji.
Wszystko się da, tylko nie zawsze wiadomo jak.

Chcę pisać obiektowo i tego się trzymać.
To nie ma nic do rzeczy, użycie wektora poza klasą nie przeczy programowaniu obiektowemu.
P-58070
Admixior
» 2012-06-08 10:05:48
Temat co prawda wyjaśniony ale dołożę kilka słów.

Żebyś mógł używać funkcji typu dodaj usuń to najlepiej chyba by było zrobić coś a'la pojemnik na samochody który będzie zawierał możliwość dodawania ich.
Chodzi mi mniej więcej o taki kod:
inkludy:
C/C++
#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>
using namespace std;
C/C++
//*******  Tutaj klasa która bedzie zawierala informacje o samochodzie *******
class samochod_info
{
public:
    string marka;
    string model;
    string paliwo;
    int pojemnosc;
    int rok;
    samochod_info( string xmarka, string xmodel, string xpaliwo, int xpojemnosc, int xrok );
};

samochod_info::samochod_info( string xmarka, string xmodel, string xpaliwo, int xpojemnosc, int xrok )
    : marka( xmarka )
    , model( xmodel )
    , paliwo( xpaliwo )
    , pojemnosc( xpojemnosc )
    , rok( xrok )
{
}
C/C++
//****** Tutaj klasa ktora bedzie przechowywala samochody - pojemnik na nie *******
class samochody
{
private:
    samochody() { }
    vector < samochod_info > samochod;
public:
    void ilosc() { return samochod.size(); }
    void wyswietl();
    void dodaj();
    void edytuj();
    void usun();
};

void samochody::wyswietl()
{
    for( int i = 0; i < samochod.size(); i++ )
    {
        cout << endl;
        cout << i + 1 << ". Marka: " << samochod[ i ].marka << endl;
        cout << "   Model: " << samochod[ i ].model << endl;
        cout << "   Paliwo: " << samochod[ i ].paliwo << endl;
        cout << "   Pojemnosc: " << samochod[ i ].pojemnosc << endl;
        cout << "   Rok: " << samochod[ i ].rok << endl;
    }
    cout << endl;
    system( "pause" );
}

void samochody::dodaj()
{
    cout << endl;
    cout << "Podaj marke: ";
    cin >> Xmarka;
    cout << "Podaj model: ";
    cin >> Xmodel;
    cout << "Podaj paliwo: ";
    cin >> Xpaliwo;
    cout << "Podaj pojemnosc: ";
    cin >> Xpojemnosc;
    cout << "Podaj rok: ";
    cin >> Xrok;
    samochod.push_back( samochod_info( Xmodel, Xmarka, Xpaliwo, Xpojemnosc, Xrok ) );
    cout << endl << "Dodano pomyslnie!" << endl << endl;
    system( "pause" );
}

void samochody::edytuj()
{
    cout << endl;
    cout << "Podaj index pojazdu: ";
    cin >> x;
    cout << endl << "Aktualne zestawienie dla indeksu nr " << x << ":" << endl;
    cout << x << ". Marka: " << samochod[ x - 1 ].marka << endl;
    cout << "   Model: " << samochod[ x - 1 ].model << endl;
    cout << "   Paliwo: " << samochod[ x - 1 ].paliwo << endl;
    cout << "   Pojemnosc: " << samochod[ x - 1 ].pojemnosc << endl;
    cout << "   Rok: " << samochod[ x - 1 ].rok << endl;
    cout << endl << "Podaj nowe zestawienie: " << endl;
    cout << x << ". Marka: ";
    cin >> samochod[ x - 1 ].marka;
    cout << "   Model: ";
    cin >> samochod[ x - 1 ].model;
    cout << "   Paliwo: ";
    cin >> samochod[ x - 1 ].paliwo;
    cout << "   Pojemnosc: ";
    cin >> samochod[ x - 1 ].pojemnosc;
    cout << "   Rok: ";
    cin >> samochod[ x - 1 ].rok;
    cout << endl << "Zedytowano pomyslnie!" << endl << endl;
    system( "pause" );
}

void samochody::usun()
{
    cout << endl;
    cout << "Podaj index pojazdu: ";
    cin >> x;
    samochod.erase( samochod.begin() + x - 1 );
    cout << endl << "Usunieto pomyslnie!" << endl << endl;
    system( "pause" );
}
C/C++
int main()
{
    samochody audi;
    samochody opel;
    audi.dodaj();
    opel.dodaj();
    audi.dodaj();
    audi.wypisz();
    opel.wypisz();
    system( "pause" );
    return 0;
}
P-58073
1 « 2 »
Poprzednia strona Strona 2 z 2