Problem z linkerem - undefined reference to...

0

Hej! Mam pewien problem.
Prosta aplikacja ma 3 pliki

main.cpp

#include <iostream>
#include <string>
#include "rachunek.h"
using namespace std;



int main()
{
  TRachunek ror("Alicja", "Nowak", 0);
    ror.Wplata(400);
    ror.NaliczOdsetki(2.3);
    ror.Wyswietl();


    cout << "Witaj!" << endl;


    return 0;
}

 

rachunek.cpp

 
#include <iostream>
#include <string>
#include "rachunek.h"

// deklarujemy przestrzen nazw
using namespace std;

// konstruktor z parametrami
TRachunek::TRachunek(string _imie, string _nazwisko, int _saldo)
{
    imie = _imie;
    nazwisko = _nazwisko;
    saldo = _saldo;
    debet = 0;
}
// funkcja zwracajaca stan konta
int TRachunek::PodajStanKonta()
{
    return saldo + debet;
}

// funkcja powodujaca wplate na konto
void TRachunek::Wplata(int wplata)
{
 /kod
}

bool TRachunek::Wyplata(int kwota)
{
 // kod
}

bool TRachunek::CzyDebet()
{
     if (saldo < 0)
     {
         return true;
     }
     else
     {
         return false;
     }
}

bool TRachunek::Przelew(TRachunek rachunek, int kwota)
{
// jakis tam kod

}

double TRachunek::NaliczOdsetki(double wysokosc_oprocentowania)
{
// jakis tam kod
}

void TRachunek::Wyswietl()
{

    cout << "Imie : " << imie << "| Nazwisko : " << nazwisko << endl;
    cout << "Saldo : " << saldo << endl;
    cout << "Debet : " << debet << endl;
   cout << 
}

rachunek.h

 
#ifndef RACHUNEK_H_INCLUDED
#define RACHUNEK_H_INCLUDED
#include <iostream>
#include <string>
// deklarujemy przestrzeñ nazw
using namespace std;

class TRachunek
{
    public:
    TRachunek(string _imie, string _nazwisko, int _saldo);
    int PodajStanKonta();
    void Wplata(int wplata);
    bool Wyplata(int kwota);
    bool CzyDebet();
    bool Przelew(TRachunek rachunek, int kwota);
    double NaliczOdsetki(double wysokosc_oprocentowania);
    void Wyswietl();

    private:
    string imie, nazwisko;
    int saldo;
    int debet;


};



#endif // RACHUNEK_H_INCLUDED

Kompiluje sie ok ale...

 
obj\Debug\main.o||In function `main':|
D:\Dokumenty\ZadaniaCPP\Rachunek\main.cpp|10|undefined reference to `TRachunek::TRachunek(std::string, std::string, int)'|
D:\Dokumenty\ZadaniaCPP\Rachunek\main.cpp|11|undefined reference to `TRachunek::Wplata(int)'|
D:\Dokumenty\ZadaniaCPP\Rachunek\main.cpp|12|undefined reference to `TRachunek::NaliczOdsetki(double)'|
D:\Dokumenty\ZadaniaCPP\Rachunek\main.cpp|13|undefined reference to `TRachunek::Wyswietl()'|
||=== Build finished: 4 errors, 0 warnings ===|

Taki blad wyrzuca linker.
Uzywam Code::Blocks 10.5
kompilator MinGW

Co to moze byc??

0
TRachunek ror = new TRachunek("Alicja", "Nowak", 0);
0
     if (saldo < 0)
     {
         return true;
     }
     else
     {
         return false;
     }

Przecież to można spokojnie zapisać w jednej linijce: return saldo < 0

0
maszynaz napisał(a)
TRachunek ror = new TRachunek("Alicja", "Nowak", 0);

To tak, tak działa :)
Ale jak nie chce tworzyć dynamicznie obiektu?
W zadaniu jest tak :
Utworz obiekt ror typu TRachunek pani Alicji Nowak....
i dalej .. Zadeklaruj wskaznik pror do obiektu klasy TRachunek. Utworz dynamicznie obiekt typu TRachunek...
I przez dynamicznie rozumiem użycie new z operatorem -> przy odwoływaniu się do członków klasy...
A to wczesniejsze utwórz obiekt (bez dynamicznie) to bez słowa new i odwoływanie się do elementów klasy poprzez kropkę . ...

0

Ale czy jak dodam static w deklaracji klasy to bede mogle tez uzywac new?
Chodzi mi o to, zeby tak zadeklarowac klase aby mozna bylo uzywac i ze slowem new i bez tego slowa.
Wszystko jest ok jak umieszczam klase w pliku main.cpp, tam gdzie funkcja glowna jest....
Jak umieszczam w osobnym pliku cpp i h to sa problemy z linkerem przy "statycznym" tworzeniu klasy, bez slowka new...

0

@maszynaz: Co Ty za głupoty wypisujesz?! Chyba Ci się języki pomyliły.

Obiekty dowolnej klasy mogą być tworzone za pomocą "new" i "bez new". Twój problem jest taki, że klasa należy do osobnej jednostki translacji. To co robi linker, to właśnie łączy pliki obiektowe powstałe w procesie kompilacji. No ale musi wiedzieć jakie. Musisz dołączyć do projektu wszystkie pliki. Nie wiem jak to się robi w Twoim IDE.

0

No wlasnie C++ wbrew pozorom nie jest latwy, ale jednak z uporem maniaka go sie ucze (znajomi sie dziwia, ze nie inwestuje w Jave)...
Tak czy siak jak uzywam new to jest ok.
Jesli definicje klasy przeniose do pliku main.cpp (bez dzielenia programu na osobne pliki cpp i h) to jest ok. Dziala zarowno dynamiczne tworzenie jak i statyczne...
A moze cos tutaj slowko extern ma do tego??? W pliku h?

1

Pomijając dwie linijki z pliku rachunk.cpp: (25 i 63) kod jest poprawny, bo udało mi się go uruchomić. Może jednak ma tutaj coś, co Ci napisałem? Zadajesz pytanie, ale olewasz odpowiedź...

0

Ale nie olewam odpowiedzi. W Code::Blocks wszystkie pliki sa w projekcie :(

0

Nie znam tego IDE, ale zrób tak:
Utwórz nowy projekt. Przekopiuj kod ze starego projektu do pliku main.cpp, potem utwórz nowy plik rachunek.h i rachunek.cpp za pomcą Code::Blocksa i przekopiuj zawartość z poprzedniego projektu.

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