INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Klasse in Klasse instanzieren
21.02.2015, 06:56 (Dieser Beitrag wurde zuletzt bearbeitet: 21.02.2015 07:01 von Smidoino.)
Beitrag #1
Klasse in Klasse instanzieren
Hallo liebes Forum, ich bin ein neuer.

Von Java und Actionscript kommend tue ich mich doch etwas schwer mit Arduino.
Im konkreten Fall möchte ich eine Klasse (LiquidCrystal) in einer eigenen Klasse in­s­tan­zi­e­ren.

HarpDisplay.h
Code:
#ifndef HarpDisplay_h
#define HarpDisplay_h
#include <Arduino.h>
#include <LiquidCrystal.h>
#include <Wire.h>

class HarpDisplay{
  private:
  int lcd04; // rs
  int lcd05; // r/w  brücke auf masse
  int lcd06; // enable Signal
  int lcd11; // d4
  int lcd12; // d5
  int lcd13; // d6
  int lcd14; // d7
  //LiquidCrystal lcd;
  
  public:
  HarpDisplay();
};
#endif



HarpDisplay.cpp
Code:
#include "Arduino.h"
#include "HarpDisplay.h"
#include <LiquidCrystal.h>
#include <Wire.h>

HarpDisplay::HarpDisplay(){
  lcd04=7;   // rs
  lcd05=-1;  // r/w  brücke auf masse
  lcd06=6;   // enable Signal
  lcd11=5;   // d4
  lcd12=4;   // d5
  lcd13=3;   // d6
  lcd14=2;   // d7
  //lcd(lcd04, lcd05, lcd06, lcd11, lcd12, lcd13, lcd14);
  //lcd=new LiquidCrystal(lcd04, lcd05, lcd06, lcd11, lcd12, lcd13, lcd14);
}

Soweit keine Schwierigkeiten. Aber kommentiert Ihr den einen und anderen Kommentar aus, könnt ihr euch sicher mein Problem vorstellen.
Wenn es gebraucht wird, poste ich auch gerne Fehlermeldungen.

Ich danke für Hilfe.
Smidoino.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.02.2015, 12:50
Beitrag #2
RE: Klasse in Klasse instanzieren
Hi,
vielleicht ist das Dein Problem:
Die Standard-Arduino IDE kann keine verschachtelten Libraries. Zumindest musst die die von Dir includierten .h-Dateien nochmal in der Hauptdatei includieren.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.02.2015, 21:30
Beitrag #3
RE: Klasse in Klasse instanzieren
Danke für deine Antwort thorsten.

Ich habs mit der alten und der neuen IDE versucht, und auch die Klasse in der Hauptdatei includiert.

Hier ist nochmal ein Beispiel. Ich habe die classe Aclass erstellt, die ich in Bclass instanziere:
Aclass.h
Code:
#ifndef Aclass_h
#define Aclass_h
#include <Arduino.h>

class Aclass{
  private:
    int a=0;
  
  public:
    Aclass();
    
    int getA();
    void setA(int value);
};
#endif

Aclass.cpp
Code:
#include "Arduino.h"
#include "Aclass.h"

Aclass::Aclass(){
  a=0;
}

int Aclass::getA(){
  return a;
}
  
void Aclass::setA(int value){
  a=value;
}


Bclass.h
Code:
#ifndef Bclass_h
#define Bclass_h
#include <Arduino.h>
#include "Aclass.h"

class Bclass{
  private:
    Aclass a;
  
  public:
    Bclass();

    int getB();
};
#endif

Bclass.cpp
Code:
#include "Arduino.h"
#include "Bclass.h"
#include "Aclass.h"

Bclass::Bclass(){
  a.setA(123);
}

int Bclass::getB(){
  return a.getA();
}

So funktioniert alles. Wenn ich die Klasse Bclass in der Hauptdatei verwende und mir getB() ausgebe bekomme ich die "123" heraus.
Jetzt habe ich den Constructor von Aclass geändert um die Klasse direkt mit einem Wert zu instanzieren.

Aclass.h
Code:
...
class Aclass{
  private:
    int a=0;
  
  public:
    Aclass(int value);

...

Aclass.cpp
Code:
...
Aclass::Aclass(int value){
  a=value;
}
...

Die Aclass lässt sich so in der Hauptdatei auch toll instanzieren mit:
Aclass aClass(123); oder
Aclass aClass=Aclass(123):

Allerdings geht das nicht inerhalb der Bclass:
Bclass.h
Code:
...
class Bclass{
  private:
    Aclass a;
  
  public:

...

Bclass.cpp
Code:
...
Bclass::Bclass(){
  // So funtioniert schonmal nicht
  // Aclass a(321);
  // a=Aclass(321);
  // a=new Aclass(321);
  // a(321);
}
...

Für sowas muss es doch eine Möglichkeit geben...
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.02.2015, 23:39
Beitrag #4
RE: Klasse in Klasse instanzieren
Hi,
das Problem ist hier wahrscheinlich, dass "a" schon instanziiert ist, wenn der Rumpf des Konstruktors von Bclass ausgeführt wird.
Versuch's mal so:
Code:
Bclass::Bclass() : a(321) { }

Im Detail:

// Aclass a(321);
Das erzeugt ein lokales "a", welches das Attribut "a" verschattet.

// a=Aclass(321);
Das geht wohl nicht, da der operator= für Aclass nicht definiert ist.

// a=new Aclass(321);
Das geht nicht, weil "a" kein Pointer ist. Das ist ja kein Java(script).

// a(321);
Das geht nicht, weil a keine Methode oder Funktion ist. Das geht für Instanzen nur bei der Definition oder direkt im Konstruktor"kopf".

Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.02.2015, 00:01
Beitrag #5
RE: Klasse in Klasse instanzieren
(21.02.2015 06:56)Smidoino schrieb:  Hallo liebes Forum, ich bin ein neuer.

Von Java und Actionscript kommend tue ich mich doch etwas schwer mit Arduino.
Im konkreten Fall möchte ich eine Klasse (LiquidCrystal) in einer eigenen Klasse in­s­tan­zi­e­ren.

HarpDisplay.h
Code:
#ifndef HarpDisplay_h
#define HarpDisplay_h
#include <Arduino.h>
#include <LiquidCrystal.h>
#include <Wire.h>

class HarpDisplay{
  private:
  int lcd04; // rs
  int lcd05; // r/w  brücke auf masse
  int lcd06; // enable Signal
  int lcd11; // d4
  int lcd12; // d5
  int lcd13; // d6
  int lcd14; // d7
  //LiquidCrystal lcd;
  
  public:
  HarpDisplay();
};
#endif



HarpDisplay.cpp
Code:
#include "Arduino.h"
#include "HarpDisplay.h"
#include <LiquidCrystal.h>
#include <Wire.h>

HarpDisplay::HarpDisplay(){
  lcd04=7;   // rs
  lcd05=-1;  // r/w  brücke auf masse
  lcd06=6;   // enable Signal
  lcd11=5;   // d4
  lcd12=4;   // d5
  lcd13=3;   // d6
  lcd14=2;   // d7
  //lcd(lcd04, lcd05, lcd06, lcd11, lcd12, lcd13, lcd14);
  //lcd=new LiquidCrystal(lcd04, lcd05, lcd06, lcd11, lcd12, lcd13, lcd14);
}

Soweit keine Schwierigkeiten. Aber kommentiert Ihr den einen und anderen Kommentar aus, könnt ihr euch sicher mein Problem vorstellen.
Wenn es gebraucht wird, poste ich auch gerne Fehlermeldungen.

Ich danke für Hilfe.
Smidoino.

Versuche mal
---
LiquidCrystal lcd;
.
.
.
.
lcd = LiquidCrystal (........
---
oder

LiquidCrystal* lcd;
.
.
.
.
lcd = new LiquidCrystal (.....
----
beides sollte gehen
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.02.2015, 01:33
Beitrag #6
RE: Klasse in Klasse instanzieren
Oh Thorsten, mein Held.
Das funzt. Mir ist allerding nicht klar was mit dieser Syntax genau passiert. Wenn du noch magst würde ich mich über mehr Infos dazu freuen.


@Pit:
Die erste Variante habe ich schon durch, was nicht geklappt hat. Die zweite werde ich später mal versuchen. Kannst du mir sagen wofür der Stern steht?
-> LiquidCrystal*


Ich danke euch beiden für die Hilfe.
Smi.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.02.2015, 08:29
Beitrag #7
RE: Klasse in Klasse instanzieren
(25.02.2015 01:33)Smidoino schrieb:  Oh Thorsten, mein Held.
Das funzt. Mir ist allerding nicht klar was mit dieser Syntax genau passiert. Wenn du noch magst würde ich mich über mehr Infos dazu freuen.


@Pit:
Die erste Variante habe ich schon durch, was nicht geklappt hat. Die zweite werde ich später mal versuchen. Kannst du mir sagen wofür der Stern steht?
-> LiquidCrystal*


Ich danke euch beiden für die Hilfe.
Smi.

Wenn die erste Variante nicht geht, dann hat LiquidCrystal keinen geeigneten Zuweisungsoperator deklariert oder der Compiler schafft das nicht.
In diesem Fall bleibt lcd mit den SetterMethoden zu füllen, in der Beschreibung der Klasse LiquidCrystal nachschauen wie sie heissen und benutzt werden.
Das Defaultobjekt wurde durch "lcd LiquidCrystal;" bereits intanziert.

Wenn man den "new" Operator benutzen will muss nicht das Objekt sondern der Zeiger darauf deklariert werden.
Der Typ des Zeigers ist "LiquidCrystal* lcd".
new konstruktet das Objekt und weisst den Zeiger darauf auf lcd zu.
so konstruierte Objekt liegen auf dem Heap, nicht auf dem Stack.

Objekte die im Stack liegen werden im Destruktor deiner Klasse HarpDisplay automatische dekonstruktet. Dazu reicht der Defaultdestruktor.

Objekte die im Heap liegen müssen spätestens im Destruktor der Klasse HarpDisplay mit "delete lcd;" dekonstruktet werden. Dazu ist ein expliziter Destruktor notwendig.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.02.2015, 11:22
Beitrag #8
RE: Klasse in Klasse instanzieren
(25.02.2015 01:33)Smidoino schrieb:  Oh Thorsten, mein Held.
Habe ich jetzt eine Jungfrau vor dem Drachen gerettet?

Zitat:Das funzt. Mir ist allerding nicht klar was mit dieser Syntax genau passiert. Wenn du noch magst würde ich mich über mehr Infos dazu freuen.
Wenn man sowas hinschreibt:
Code:
class A {
  B xy;
};
...dann bedeutet das, dass es ein Instanzattribut des Typs B gibt. Wenn B tatsächlich eine Klasse ist, dann wird bein Instanziieren von A automatisch der Default-Konstruktor für B aufgerufen. D.h. im Rumpf vom Konstruktor von A ist sozusagen xy schon fertig. Wenn man einen anderen Konstruktor aufrufen will, dann muss man das so machen, wie ich es geschrieben habe. Das ist so ähnlich wie wenn man Superklassen hat und einen bestimmten Konstruktor aufrufen will. Tatsächlich werden bei C++ Instanzattribute und (virtuelle) Superklassen ähnlich behandelt.
Wenn man andere Sprachen betrachtet, dann bedeutet die obige Deklaration nur, dass xy eine Referenz auf ein B-Objekt ist. In C++ ist das aber nicht so. Wenn man das meint, dann muss man es explizit so schreiben:
Code:
class A {
  B* xy;
};
xy ist jetzt eine Referenz (aka Zeiger, Pointer, Adresse) auf ein B-Objekt. Diese Referenz ist am Anfang undefiniert. (Nicht unbedingt NULL, es kann jeder beliebige Schwachsinn drinstehen.) Deshalb muss man in dem Fall explizit im Rumpf des Konstruktors für A was Sinnvolles daraus machen, etwa
Code:
xy = new B();
In C++ gibt es also explizit das Konzept, zwischen dem Objekt selbst und seiner Referenz zu unterscheiden. Nehmen wir mal an, B hat eine Methode "blubbern", dann wird diese Methode im ersten Fall (B xy) so aufgerufen:
Code:
xy.blubbern();
Im zweiten Fall muss man xy erst "dereferenzieren", also:
Code:
(*xy).blubbern();
Da das etwas blöd aussieht und oft vorkommt gibt es dafür eine Kurzschreibweise:
Code:
xy->blubbern();
Alles klar?
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  C++ string Klasse in Sketch benutzen? HaWe 4 858 01.05.2015 14:48
Letzter Beitrag: HaWe
  Referenz eines Arrays in Klasse nutzen jensel 5 873 23.02.2015 11:46
Letzter Beitrag: Thorsten Pferdekämper
  IR Sende / Empfänger Klasse - wo hier deponieren? Hobel 0 1.649 15.09.2013 13:00
Letzter Beitrag: Hobel

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste