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

Dodanie konstruktora/destruktora powoduje undefined reference

Ostatnio zmodyfikowano 2013-06-12 22:02
Autor Wiadomość
p4vv37
Temat założony przez niniejszego użytkownika
Dodanie konstruktora/destruktora powoduje undefined reference
» 2013-06-06 13:45:55
Cześć
Jestem bardzo początkujący w C++. Staram się nauczyć przeciążania operatorów i klas porządnie.

Napisałem prosty program:

C/C++
#include <iostream>

using namespace std;

class Klasa {
private:
    int a;
public:
    Klasa();
    virtual ~Klasa();
    int operator =( int b ) {
        this->a = b;
    }
    friend ostream & operator <<( ostream & wy, Klasa & kl );
};

ostream & operator <<( ostream & wy, Klasa & kl ) {
    return wy << kl.a;
}
int main()
{
    Klasa klasa;
    klasa = 5;
    cout << klasa;
    cout << "Hello world!" << endl;
    return 0;
}

Nie widzę w nim błędów, ale po zbudowaniu wyrzuca mi
Undefined reference to Klasa:każda metoda z klasy...

Po zakomentowaniu kreatora/destruktora program działa...
Dlaczego tak jest i co robię źle?
P-85040
wojownik266
» 2013-06-06 13:57:56
Jak na moje oko to musisz dodać zaraz za klasą definicje konstruktora i destruktora i program po tym zabiegu ma działać!!
C/C++
Klasa::Klasa()
{
   
}
Klasa::~Klasa()
{
   
}
P-85043
pekfos
» 2013-06-06 15:28:21
Dlaczego tak jest i co robię źle?
Dokładnie z tego samego powodu, jak przy zwykłych funkcjach. Nie można wywołać kodu, który nie istnieje.
C/C++
int f();

int main()
{
    f(); // skompiluje się, bo f jest znane kompilatorowi
    //Ale linker wywali bład, bo nie ma czego pod to podpiąć.
}
P-85051
f651144
» 2013-06-08 19:39:34
To co napisał pan wojownik266 może być dla Ciebie nie do końca zrozumiałe. W Twojej konwencji będzie wyglądać to tak:
C/C++
class Klasa {
private:
    int a;
public:
    Klasa() {
        // To, co ma zrobić konstruktor, np. zainicjalizować a:
        this->a = 0;
    }
    virtual ~Klasa() {
        // To, co ma zrobić destruktor, np. napisać coś na stdout:
        cout << "Jestem destruktorem klasy \"Klasa\"" << endl;
    }
    int operator =( int b ) {
        this->a = b;
    }
    friend ostream & operator <<( ostream & wy, Klasa & kl );
};

Chociaż moim zdaniem powinieneś raczej zapisać to tak jak zaproponował wojownik266 (dobry nawyk, jeśli kiedyś będziesz chciał napisać bibliotekę).
P-85196
p4vv37
Temat założony przez niniejszego użytkownika
» 2013-06-12 22:02:12
Dzięki, zorientowałem się chwilę później jednak..

Głupi błąd. Dzięki za pomoc.
P-85451
« 1 »
  Strona 1 z 1