Konstruktor ohne Argumente

Ich schlage mich mit einem sehr merkwürdigen Problem herum. Ich habe meinen Quellcode auf die Minimalstruktur reduziert, bei der der Fehler auftritt:

Hier ist mein Code:

Hauptprogramm:

#include "RD_40.h"

void setup() {
  // put your setup code here, to run once:
  RD_40 myRD40;

}

void loop() {
  // put your main code here, to run repeatedly:

}

Hier die Definition der Klasse RD_40. Enthalten im Tab RD_40.h:

#ifndef RD_40_H
#define RD_40_H

#include <Arduino.h>

class RD_40 {
  private:
  int _test;

  public:
    RD_40();                              // Constructor
    void begin();
};

#endif

Und zum Abschluss noch RD_40.CPP:

#include "RD_40.h"
#include <Arduino.h>

RD_40::RD_40() {
}

RD_40::begin() {
}

Wenn ich dieses simple Programm (alle Funktionen weggelassen) compiliere, bekomme ich folgende Fehlermeldung:

c:/pfad.../bin/ld.exe: sketch\test_class.ino.cpp.o:(.text.setup+0x0): undefined reference to `_ZN5RD_40C1Ev'
c:/pfad.../bin/ld.exe: sketch\test_class.ino.cpp.o: in function `setup':
C:\pfad...\test_class/test_class.ino:5: undefined reference to `_ZN5RD_40C1Ev'
collect2.exe: error: ld returned 1 exit status
exit status 1
Fehler beim Kompilieren für das Board Generic ESP8285 Module.

Was um alles in der Welt stimmt da nicht? Bin ich blind?

Für einen Hinweis wäre ich sehr dankbar.

Beste Grüße, Ludwig

Die Methode begin in RD_40.cpp sollte wohl

void RD_40::begin() {
}

sein. Es fehlt der Typ.

Hallo,

beim Default Konstruktor hast du 3 Möglichkeiten.
Nichts angeben, dann wird er automatisch erzeugt
oder
RD_40() {}
oder
RD_40() = default;

Ich würde für "nichts" oder letzte Variante plädieren.

Naja ... er hat halt Variante 2 gewählt und die in die cpp Datei gezogen.

Besser

RD_40() {};                              // Constructor

Nur Letzter :roll_eyes:

Hallo,

die Qual der Wahl. Ich hatte es ohne Lib getestet. Da war ich zu schnell. Alles gut.

Wofür ist das Semikolon da?

@ all
Und natürlich kann man einen leeren Konstruktor in der *.cpp unterbringen, wie oben von @ludwig001 vorgeführt.
Das ist zwar überflüssig, aber nicht verboten.

Danke für den Hinweis. Ich kann jedoch nicht erkennen, dass jemand behauptet hätte, dass das verboten ist.

Das werde ich nicht weiter erläutern.

Hallo zusammen,

vielen Dank für Eure prompte Rückmeldung! Zumindest geht es, wenn ich RD_40() {} im Header File angebe. Damit kann ich erst mal arbeiten :wink:

Ich müsste aber lügen würde ich behaupten, dass ich es verstanden habe. Ich hatte den Konstruktor im CPP File doch genau so definiert: RD_40::RD_40() {}. Klar, im Header stand nix von Default - lag es daran?

Hallo,

C++ Default Constructor

Das ist nicht das Problem!

Dieses übersetzt bei mir perfekt!

RD_40.h (205 Bytes)
sketch_mar12d001.ino (177 Bytes)
RD_40.cpp (95 Bytes)

Das ist aber extrem schade, dass du dein Wissen nicht teilen willst!

Wie kommst du darauf?

Hallo,

keine Sorge, #12 ist identisch mit #2.

@combie, vielen Dank für Deine angehängten Files. Auch bei mir laufen sie glatt durch den Compiler.

Du hast genau einen Fehler korrigiert, nämlich das fehlende "void" bei meiner "begin()" Methode ergänzt.

Wenn ich diesen Fehler in meinem Originalfile korrigiere, ändert das aber nichts! Der Compilerfehler ist und bleibt derselbe (siehe oben).

Könntet Ihr mal folgende Files bei Euch compilieren? Diese Files erzeugen bei mir den Fehler.

RD_40.cpp (95 Bytes)
RD_40.h (205 Bytes)
sketch_mar12d001.ino (177 Bytes)

ich habe fertig.

Sieht hübscher aus :smiling_face:

Naja, es stand da schon und ich habe es nicht gelöscht, klingt langweilig.

"Generic ESP8285 Module" habe ich nicht, dafür Win10, Arduino IDE 1.8.19 und ESP32 Core 2.0.6:

Der Sketch verwendet 227117 Bytes (17%) des Programmspeicherplatzes. Das Maximum sind 1310720 Bytes.
Globale Variablen verwenden 21760 Bytes (6%) des dynamischen Speichers, 305920 Bytes für lokale Variablen verbleiben. Das Maximum sind 327680 Bytes.

Kompiliert

Bevor ich #2 gepostet habe, habe ich das „Programm“ ebenfalls compiliert, falls evtl. noch andere Fehler als der offensichtliche, vorhanden sind. Es ist einwandfrei durchgelaufen.

Warum Dein Linker trotz Korrektur noch Probleme hat, ist ,zumindest für mich, nicht ersichtlich.

Hast Du evtl. in deinem Programmverzeichnis noch eine andere cpp Datei liegen, die hier bisher nicht erwähnt wurde?

Das gibt es nicht......

Das Problem hängt mit der File Extension zusammen:
Ich hatte das cpp-File mit Großbuchstaben in der Extension benannt, also "RD_40.CPP". Dies führte offensichtlich dazu, dass das File nicht erkannt und daher auch nicht compiliert wurde. Wenn ich das File umbenenne in "RD_40.cpp" verschwindet der Fehler.

hmm..