dan556677544
Anmeldungsdatum: 19. Mai 2016
Beiträge: Zähle...
|
Hi, ich bin bultiger Anfänger in Sachen C++ und komme nun einfach nicht weiter. Ich habe eine Klasse geschrieben und bekommen beim Kompilieren folgende Fehler:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 | /tmp/ccy0Pqe6.o: In Funktion `KomZahl::setReell(double)':
aufgabe1.cpp:(.text+0x16): Nicht definierter Verweis auf `KomZahl::reell'
/tmp/ccy0Pqe6.o: In Funktion `KomZahl::getReell()':
aufgabe1.cpp:(.text+0x26): Nicht definierter Verweis auf `KomZahl::reell'
/tmp/ccy0Pqe6.o: In Funktion `KomZahl::setImag(double)':
aufgabe1.cpp:(.text+0x42): Nicht definierter Verweis auf `KomZahl::imag'
/tmp/ccy0Pqe6.o: In Funktion `KomZahl::getImag()':
aufgabe1.cpp:(.text+0x52): Nicht definierter Verweis auf `KomZahl::imag'
/tmp/ccy0Pqe6.o: In Funktion `KomZahl::ausgabe()':
aufgabe1.cpp:(.text+0xec): Nicht definierter Verweis auf `std::cout'
aufgabe1.cpp:(.text+0xf1): Nicht definierter Verweis auf `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
aufgabe1.cpp:(.text+0x115): Nicht definierter Verweis auf `std::cout'
aufgabe1.cpp:(.text+0x11a): Nicht definierter Verweis auf `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
aufgabe1.cpp:(.text+0x143): Nicht definierter Verweis auf `std::cout'
aufgabe1.cpp:(.text+0x148): Nicht definierter Verweis auf `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
aufgabe1.cpp:(.text+0x155): Nicht definierter Verweis auf `std::ostream::operator<<(double)'
/tmp/ccy0Pqe6.o: In Funktion `__static_initialization_and_destruction_0(int, int)':
aufgabe1.cpp:(.text+0x17e): Nicht definierter Verweis auf `std::ios_base::Init::Init()'
aufgabe1.cpp:(.text+0x18d): Nicht definierter Verweis auf `std::ios_base::Init::~Init()'
/tmp/ccy0Pqe6.o: In Funktion `KomZahl::KomZahl(double, double)':
aufgabe1.cpp:(.text._ZN7KomZahlC2Edd[_ZN7KomZahlC5Edd]+0x1b): Nicht definierter Verweis auf `KomZahl::reell'
aufgabe1.cpp:(.text._ZN7KomZahlC2Edd[_ZN7KomZahlC5Edd]+0x28): Nicht definierter Verweis auf `KomZahl::imag'
collect2: error: ld returned 1 exit status
|
Das ist meine Klasse:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 | #include <iostream>
using namespace std;
class KomZahl {
public:
static double reell;
static double imag;
// Member Functions deklarieren
static double getReell(void);
static double getImag(void);
void setReell(double r);
void setImag(double i);
static void ausgabe(void);
// Konstruktor
KomZahl(double r, double i) {
reell = r;
imag = i;
}
};
void KomZahl::setReell(double r) {
reell = r;
}
double KomZahl::getReell(void) {
return reell;
}
void KomZahl::setImag(double i) {
imag = i;
}
double KomZahl::getImag(void) {
return imag;
}
int main() {
KomZahl(1.3,3.4);
KomZahl::ausgabe();
}
// bool equal(double komZahl) {
// // TODO
// }
void KomZahl::ausgabe(void) {
if (KomZahl::getImag() == 0) {
cout << "Imagenärteil ist 0.";
return;
}
if (KomZahl::getImag() < 0) {
cout << "Imagenärteil ist kleiner 0.";
return;
}
cout << "Ergebnis: " << (KomZahl::getReell() + KomZahl::getImag());
}
|
Kann mir jemand helfen und sagen, was ich wo/wie ändern muss damit der Code kompiliert? Google hat mir leider bisher nicht helfen können. Gruß
Daniel
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12801
|
Du müsstest mal zeigen, wie Du das Programm linkst. Das ist eine Fehlermeldung des Linkers. Ist das übrigens Absicht, dass Du die Ausgaben nicht mit einem endl abschließt?
|
dan556677544
(Themenstarter)
Anmeldungsdatum: 19. Mai 2016
Beiträge: 8
|
rklm schrieb: Du müsstest mal zeigen, wie Du das Programm linkst. Das ist eine Fehlermeldung des Linkers.
Ok. Kannst du mir noch sagen was du genau damit meinst? Ich habe von C++ überhaupt keine Ahnung. Ich bin dabei es für die Uni zu lernen, normalerweise bin ich Webentwickler... ☺ rklm schrieb: Ist das übrigens Absicht, dass Du die Ausgaben nicht mit einem endl abschließt?
Nö, muss man das? Das stand in keinen Tutorial.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12801
|
dan556677544 schrieb: rklm schrieb: Du müsstest mal zeigen, wie Du das Programm linkst. Das ist eine Fehlermeldung des Linkers.
Ok. Kannst du mir noch sagen was du genau damit meinst? Ich habe von C++ überhaupt keine Ahnung. Ich bin dabei es für die Uni zu lernen, normalerweise bin ich Webentwickler... ☺
Dann schick einfach die Kommandozeile, die die eingangs gepostete Ausgabe produziert hat.
rklm schrieb: Ist das übrigens Absicht, dass Du die Ausgaben nicht mit einem endl abschließt?
Nö, muss man das? Das stand in keinen Tutorial.
Ist halt ein Zeilenumbruch. Müssen muss man gar nix. Aber vielleicht sieht es dann besser aus. 😬
|
dan556677544
(Themenstarter)
Anmeldungsdatum: 19. Mai 2016
Beiträge: 8
|
rklm schrieb: dan556677544 schrieb: rklm schrieb: Du müsstest mal zeigen, wie Du das Programm linkst. Das ist eine Fehlermeldung des Linkers.
Ok. Kannst du mir noch sagen was du genau damit meinst? Ich habe von C++ überhaupt keine Ahnung. Ich bin dabei es für die Uni zu lernen, normalerweise bin ich Webentwickler... ☺
Dann schick einfach die Kommandozeile, die die eingangs gepostete Ausgabe produziert hat.
So rufe ich das ganze auf: gcc aufgabe1.cpp -o aufgabe1
rklm schrieb: Ist das übrigens Absicht, dass Du die Ausgaben nicht mit einem endl abschließt?
Nö, muss man das? Das stand in keinen Tutorial.
Ist halt ein Zeilenumbruch. Müssen muss man gar nix. Aber vielleicht sieht es dann besser aus. 😬
Ok. ☺
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12801
|
dan556677544 schrieb: rklm schrieb:
Dann schick einfach die Kommandozeile, die die eingangs gepostete Ausgabe produziert hat.
So rufe ich das ganze auf: gcc aufgabe1.cpp -o aufgabe1
Da haben wir doch schon den Fehler: Du willst ein C++-Programm mit dem C-Compiler übersetzen und linken. Übersetzen klappt noch, weil das der gcc kann, aber beim Linken unterscheiden sich die Einstellungen. Nimm mal g++ statt gcc .
|
dan556677544
(Themenstarter)
Anmeldungsdatum: 19. Mai 2016
Beiträge: 8
|
rklm schrieb: dan556677544 schrieb: rklm schrieb:
Dann schick einfach die Kommandozeile, die die eingangs gepostete Ausgabe produziert hat.
So rufe ich das ganze auf: gcc aufgabe1.cpp -o aufgabe1
Da haben wir doch schon den Fehler: Du willst ein C++-Programm mit dem C-Compiler übersetzen und linken. Übersetzen klappt noch, weil das der gcc kann, aber beim Linken unterscheiden sich die Einstellungen. Nimm mal g++ statt gcc .
Ok, danke dir. Ich habe das mal ausprobiert, leider kommen jetzt folgende Fehler:
1
2
3
4
5
6
7
8
9
10
11
12 | /tmp/ccf4FC6v.o: In Funktion `KomZahl::setReell(double)':
aufgabe1.cpp:(.text+0x16): Nicht definierter Verweis auf `KomZahl::reell'
/tmp/ccf4FC6v.o: In Funktion `KomZahl::getReell()':
aufgabe1.cpp:(.text+0x26): Nicht definierter Verweis auf `KomZahl::reell'
/tmp/ccf4FC6v.o: In Funktion `KomZahl::setImag(double)':
aufgabe1.cpp:(.text+0x42): Nicht definierter Verweis auf `KomZahl::imag'
/tmp/ccf4FC6v.o: In Funktion `KomZahl::getImag()':
aufgabe1.cpp:(.text+0x52): Nicht definierter Verweis auf `KomZahl::imag'
/tmp/ccf4FC6v.o: In Funktion `KomZahl::KomZahl(double, double)':
aufgabe1.cpp:(.text._ZN7KomZahlC2Edd[_ZN7KomZahlC5Edd]+0x1b): Nicht definierter Verweis auf `KomZahl::reell'
aufgabe1.cpp:(.text._ZN7KomZahlC2Edd[_ZN7KomZahlC5Edd]+0x28): Nicht definierter Verweis auf `KomZahl::imag'
collect2: error: ld returned 1 exit status
|
|
jubuntu79
Anmeldungsdatum: 13. Februar 2011
Beiträge: 466
Wohnort: Nürnberg
|
In Zeile 41-44 ist der Fehler
| int main() {
KomZahl(1.3,3.4);
KomZahl::ausgabe();
}
|
Du musst eine Instanz der Klasse anlegen, also
| int main() {
KomZahl meineKomZahlInstanz(1.3,3.4);
meineKomZahlInstanz.ausgabe();
}
|
Gruß jubuntu79
|
dan556677544
(Themenstarter)
Anmeldungsdatum: 19. Mai 2016
Beiträge: 8
|
Hi jubuntu79, hat leider nicht geholfen. Die Fehler kommen immer noch:
1
2
3
4
5
6
7
8
9
10
11
12 | /tmp/ccBZ4Wax.o: In Funktion `KomZahl::setReell(double)':
aufgabe1.cpp:(.text+0x16): Nicht definierter Verweis auf `KomZahl::reell'
/tmp/ccBZ4Wax.o: In Funktion `KomZahl::getReell()':
aufgabe1.cpp:(.text+0x26): Nicht definierter Verweis auf `KomZahl::reell'
/tmp/ccBZ4Wax.o: In Funktion `KomZahl::setImag(double)':
aufgabe1.cpp:(.text+0x42): Nicht definierter Verweis auf `KomZahl::imag'
/tmp/ccBZ4Wax.o: In Funktion `KomZahl::getImag()':
aufgabe1.cpp:(.text+0x52): Nicht definierter Verweis auf `KomZahl::imag'
/tmp/ccBZ4Wax.o: In Funktion `KomZahl::KomZahl(double, double)':
aufgabe1.cpp:(.text._ZN7KomZahlC2Edd[_ZN7KomZahlC5Edd]+0x1b): Nicht definierter Verweis auf `KomZahl::reell'
aufgabe1.cpp:(.text._ZN7KomZahlC2Edd[_ZN7KomZahlC5Edd]+0x28): Nicht definierter Verweis auf `KomZahl::imag'
collect2: error: ld returned 1 exit status
|
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12801
|
jubuntu79 schrieb: In Zeile 41-44 ist der Fehler
| int main() {
KomZahl(1.3,3.4);
KomZahl::ausgabe();
}
|
Du musst eine Instanz der Klasse anlegen, also
| int main() {
KomZahl meineKomZahlInstanz(1.3,3.4);
meineKomZahlInstanz.ausgabe();
}
|
ausgabe() ist doch static . Ich sehe folgende Fehler: | $ g++ -Wall x.cxx
/tmp/ccK0b9aG.o:x.cxx:(.rdata$.refptr._ZN7KomZahl4imagE[.refptr._ZN7KomZahl4imagE]+0x0): undefined reference to `KomZahl::imag'
/tmp/ccK0b9aG.o:x.cxx:(.rdata$.refptr._ZN7KomZahl5reellE[.refptr._ZN7KomZahl5reellE]+0x0): undefined reference to `KomZahl::reell'
collect2: error: ld returned 1 exit status
|
Das Problem ist, dass die beiden static Member nicht deklariert sind. Das ist die nötige Änderung gegenüber dem Original: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | $ diff -U5 x.cxx x-new.cxx
--- x.cxx 2016-08-22 16:32:11.233919600 +0200
+++ x-new.cxx 2016-08-22 16:33:38.599202400 +0200
@@ -20,10 +20,13 @@
reell = r;
imag = i;
}
};
+double KomZahl::imag;
+double KomZahl::reell;
+
void KomZahl::setReell(double r) {
reell = r;
}
double KomZahl::getReell(void) {
|
Das ganze Design mit der Mischung von static und Instanz-Zugriffen ist allerdings nicht gut.
|
dan556677544
(Themenstarter)
Anmeldungsdatum: 19. Mai 2016
Beiträge: 8
|
Danke rklm, dass war die Lösung. ☺
|