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ść
Unlimited
Temat założony przez niniejszego użytkownika
[Vector i klasa] Jak wywołać funkcję?
» 2012-06-07 21:48:43
Witam. Mam problem z wywołaniem funkcji w tym programie:
C/C++
#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>
using namespace std;

class samochody
{
private:
    string marka, model, paliwo;
    int pojemnosc, rok;
    string Xmarka, Xmodel, Xpaliwo;
    int x, Xpojemnosc, Xrok;
    samochody( string xmarka, string xmodel, string xpaliwo, int xpojemnosc, int xrok );
    vector < samochody > samochod;
public:
    void wyswietl();
    void dodaj();
    void edytuj();
    void usun();
};

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

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( samochody( 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" );
}

int main()
{
    int wybor;
   
    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:
            {
                break;
            }
        case 2:
            {
                break;
            }
        case 3:
            {
                break;
            }
        case 4:
            {
                break;
            }
        }
    } while( wybor != 0 );
   
    return 0;
}

Otóż gdy w int main() próbuje zadeklarować zmienną np. samochody zmienna; to dostaje błąd o treści: C:\Users\AcerAS-7552G\Desktop\Untitled1.cpp|104|error: no matching function for call to 'samochody::samochody()'| przez co nie mogę później wywołać funkcji przez dopisanie zmienna.wyswietl(); itp. Gdzie leży problem?
P-58036
xevuel
» 2012-06-07 21:50:38
Podczas pisania
samochod zmienna
 wywołuje się konstruktor o postaci samochod::samochod(), którego ty nie masz zadeklarowanego w klasie.
P-58037
Unlimited
Temat założony przez niniejszego użytkownika
» 2012-06-07 21:51:49
Mam zadeklarowane.
P-58038
xevuel
» 2012-06-07 21:52:45
Nie masz.
samochody( string xmarka, string xmodel, string xpaliwo, int xpojemnosc, int xrok );
 to nie jest ten konstruktor o którym mówiłem.
P-58039
Unlimited
Temat założony przez niniejszego użytkownika
» 2012-06-07 21:54:50
Wywołuję samochody zmienna; więc konstruktor to samochody::samochody().

Edit:
No nie wiem może ja się mylę to proszę powiedz jak wywołać tą funkcję bo już naprawdę nie wiem.
Wcześniej bez udziału vector'a zawsze wszystko dobrze było i działało.

Edit:
W części publicznej klasy wywołałem konstruktor samochody(); i poniżej klasy dodałem wpis:
C/C++
samochody::samochody()
{
}

I mam pytanie czy to takie puste ma zostać? Program działa.
P-58040
xevuel
» 2012-06-07 22:08:30
Ale ty nie masz tego konstruktura!

Wiesz, czym się różni to:
samochody::samochody( string xmarka, string xmodel, string xpaliwo, int xpojemnosc, int xrok );
od tego:
samochody::samochody();
?

Aby użyć pierwszego musiałbyś wywołać
samochody zmienna( "Opel", "Jakiś tam", "Benzyna", 1000, 1492 );
Rozumiesz?

//edit:
Ma zostać puste, no chyba, że chcesz jakiejś zmiennej przypisać na starcie daną wartość, np. przy klasie
C/C++
class Foo
{
private:
    int abc;
public:
    Foo();
};
możesz użyć konstruktora o postaci:
C/C++
Foo::Foo()
{
    this->abc = 0;
}
aby wyzerować zmienną abc.
P-58042
Admixior
» 2012-06-07 22:10:22
Nie masz zdefiniowanego konstruktora bez parametrów czyli samochody::samochody();
możesz albo zdefiniować sobie taki konstruktor w klasie umieścić: samochody(){} //nic on nie bedzie robił
albo wywoływać konstruktor który od razu umieszcza pierwsze auto: samochody zmienna(tutaj marka,model...);//tak jak masz to w kostruktorze

//PS: dziwi mnie pomysł kodu. W jaki sposób ty go zaplanowałeś. Dlaczego w klasie samochody jest vector< samochody > samochod; nie lepiej tę definicję zrobić statyczną, albo jeżeli nie potrafisz to po prostu globalną. Bo w takim razie każdy samochód będzie mógł posiadać inne samochody
C/C++
samochody x(...);
x.dodaj(...);
x.samochody[ 0 ].dodaj(...);
x.samochody[ 0 ].samochody[ 0 ].dodaj(...);
//itd

Ale najlepiej byłoby chyba zrobienie klasy samochod która będzie zawierała tylko marke model i inne info...
I z klasy tej co już masz usunąć zmienne marke model... i w vectorze dać: vector< samochod > samochody; //wtedy bedziesz miał samochody w w wektorze (bez dziwnego efektu że samochody mają inne samochody)

Jeżeli mnie nie zrozumiałeś, nie przejmuj się. W końcu dopiero zaczynasz. Kiedyś zrozumiesz o co mi chodziło jeżeli będziesz się dalej zagłębiał w c++.

//ups spóźniłem się
P-58043
Unlimited
Temat założony przez niniejszego użytkownika
» 2012-06-07 22:11:09
Tak właśnie tak zrobiłem i powiedz mi czy wtedy ta zmienna zmienna sobie automatycznie przypisuje dany konstruktor? Dosyć fajne szczerze powiedziawszy...
P-58044
« 1 » 2
  Strona 1 z 2 Następna strona