C++ objektno in razredi

Vse o programiranju na in za PC

Moderatorji: Kroko, tilz0R

C++ objektno in razredi

OdgovorNapisal/-a MocnikG » 24 Avg 2018, 22:49

Zdravo,

ker rabim optimizacijo lastnih knjižic, ki se jih je nabralo kar nekaj in nekatere celo sestavljajo nove funkcionalnosti, sem se lotil združevanja knjižic.

Naletel pa sem na problem:

imamo WiFi.h in MQTT.h, oboje je ločeno z razredi in so znane public funkcije, ter class_name. Zadeva lepo špila če v main programu definiram class name. Naprimer tako:
Koda: Izberi vse
WiFiSocket mojSocket;
MQTTStack mojMQTT;


in potem dalje v main-u uporabljam public funkcije iz posameznih razredov. (npr.: mojMQTT.MQTTPublish("tralal", "/sensor/");)

Sedaj pa bi rad imel še en vrhnji class, ki bi njegovim funkcijam nastavil parametre in bi one same shendlale povezavo na Wifi nato drug class povezavo na MQTT server in nato objavile ali se povezale na MQTT. No in to sem naredil:

Koda: Izberi vse
#include "MQTT.h"
#include "wifi.h"
WiFi cloudWiFi;
MQTT cloudMQTT;
#define ....
int main(){
  while((WiFi_Connect(WiFiSSID, WiFiPass) != WIFI_CONNECTED){
    debug.print("*");
  }

  while((MQTT_Topic_Connect(MQTTClient)) != MQTT_TOPIC_CONNECT_OK){
    debug.print("MQTT topic connect NOK")
  }
   cloudMQTT.MQTTPublish(MQTTTestTopic, "25", MQTTClient, MQTTMainTopic);

}



V posameznem .h fajlu pa je:
Koda: Izberi vse
#ifndef MQTT_h
#define MQTT_h

#include "MQTTClient.h"
#include <SocketWiFi.h>
WiFiClient wifiClient;
PubSubClient client(wifiClient);
#define MQTT_TOPIC_CONNECT_OK   1
#define MQTT_TOPIC_CONNECT_NOK  0
#define MQTT_BROKER_OK          1
#define MQTT_TOPIC_PUBLISH_OK   1
#define MQTT_TOPIC_PUBLISH_NOK  0

class MQTT{
  public:
    MQTT_Broker_Set(char *brokerAdd, int port);
    MQTT_Topic_Connect(char *clientName);
    MQTT_Topic_Reconnect(char *clientName, char *main_topic);
};
#endif



Koda: Izberi vse
#ifndef WiFi_h
#define WiFi_h

#include <SocketWiFi.h>

WiFiClient wifiClient;

#define WIFI_CONNECTED      1


class WiFi{
  public:

    int WiFi_Connect(char *ssid, char *pass);

};
#endif



potem pa v cpp fajlih, kličem posamezni .h. Kot se vidi zgoraj je to problem, da se v MQTT mora klicat WiFi. Kompajler pa vn vrže, da v WiFi.cpp funkcije, ki je v SocketWiFi.h ne najde, oz. napiše da tip ne štima: "WiFiClient: does not name a type.

Kako narediti, da prav?
*Sent*from*my* iPhone.
*Sent*from*my* Linux.
*Sent*from*my* room.
Uporabniški avatar
MocnikG
 
Prispevkov: 493
Pridružen: 18 Maj 2015, 18:56
Kraj: Koroška - MB - CE
Zahvalil se je: 47 krat
Prejel zahvalo: 78 krat
Uporabnika povabil: s55ei
Število neizkoriščenih povabil: 7

Re: C++ objektno in razredi

OdgovorNapisal/-a Kroko » 25 Avg 2018, 00:08

Kar nekaj stvari je potrebno narediti.
...če v main programu definiram class name...

S tem ne definiraš imena razreda ampak statično instantiraš objekt. To je nakaj, kar se v C++ izogiba.
https://isocpp.org/wiki/faq/ctors#static-init-order

Za začetek odvrani VSE statike v vsek razredih (npr.: WiFiClient wifiClient;). Potem pa začni takole:
Koda: Izberi vse
#include "MQTT.h"
#include "wifi.h"

int main()
{
  WiFi cloudWiFi;
  while((cloudWiFi.WiFi_Connect(WiFiSSID, WiFiPass) != WIFI_CONNECTED)
  {
    debug.print("*");
  }

  MQTT cloudMQTT;
  while((cloudMQTT.MQTT_Topic_Connect(MQTTClient)) != MQTT_TOPIC_CONNECT_OK)
  {
    debug.print("MQTT topic connect NOK")
  }
   cloudMQTT.MQTTPublish(MQTTTestTopic, "25", MQTTClient, MQTTMainTopic);
 
}

PS
#define za konstante nima v C++ kaj iskati. Uporabi "enum class".
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4805
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 684 krat
Prejel zahvalo: 1665 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: C++ objektno in razredi

OdgovorNapisal/-a MocnikG » 25 Avg 2018, 11:49

Kroko je napisal/-a:Kar nekaj stvari je potrebno narediti.
...če v main programu definiram class name...

S tem ne definiraš imena razreda ampak statično instantiraš objekt. To je nakaj, kar se v C++ izogiba.
https://isocpp.org/wiki/faq/ctors#static-init-order



To sem mislil, ja instantiraš objekt. To narediš pred main in potem uporabljaš to instanco skozi main in funkcije v main-u.

Kroko je napisal/-a:#define za konstante nima v C++ kaj iskati. Uporabi "enum class".


hvala, pozabil.

Vendar problem nastane pri uporabi mojih razredov wifi.cpp in mqtt.cpp. In sicer v wifi.cpp se uporabi instanca od splošnega wifi_socketa, ki ga uporabljam (#include <SocketWiFi.h>) in sicer WiFiClient wifiClient; potem pa bi se morala v mqtt.cpp uporabiti enaka instanca, saj mu moram povedati kje je njegov fizični sloj, v bistvu gre pa za drug razred.
*Sent*from*my* iPhone.
*Sent*from*my* Linux.
*Sent*from*my* room.
Uporabniški avatar
MocnikG
 
Prispevkov: 493
Pridružen: 18 Maj 2015, 18:56
Kraj: Koroška - MB - CE
Zahvalil se je: 47 krat
Prejel zahvalo: 78 krat
Uporabnika povabil: s55ei
Število neizkoriščenih povabil: 7

Re: C++ objektno in razredi

OdgovorNapisal/-a Kroko » 25 Avg 2018, 12:58

Ne uporabljaj statičnih instanc.
Na primer:
V main.cpp imaš "WiFi cloudWiFi;" in "MQTT cloudMQTT;" kar je narobe.
V WiFi.h imaš "WiFiClient wifiClient;" kar je narobe.
V MQTT.h imaš "WiFiClient wifiClient;" in "PubSubClient client(wifiClient);" kar je tudi narobe.

Poglej si košček kode, ki sem ga pripel v prejšnjem postu. Opazil boš, da so instance najejene znotraj main() funkcije in ne statično.

Dokler tega ne razumeš si težko predstavljam, kako se boš lotil kompozicije. To, kar želiš narediti z vrhnjo klaso je v bistvu class composition.
Tule imaš lep primer točno tega, kar potrebuješ:
https://sites.google.com/site/gbswebpor ... on-example

Si opazil, da ne glede na vrhnjo klaso "Event" ni nikjer nobene statične inicializacije?
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4805
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 684 krat
Prejel zahvalo: 1665 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: C++ objektno in razredi

OdgovorNapisal/-a MocnikG » 25 Avg 2018, 13:12

Kroko je napisal/-a:Si opazil, da ne glede na vrhnjo klaso "Event" ni nikjer nobene statične inicializacije?


sedaj sem videl, v bistvu imam podoben primer ja. Je pa inicializacija instance za Time in Date narejena v private pri class definiciji, in potem private dostopna v vseh instancah Eventa:
Koda: Izberi vse
private:

      string eventName;

      Time eventTime;

      Date eventDay;
*Sent*from*my* iPhone.
*Sent*from*my* Linux.
*Sent*from*my* room.
Uporabniški avatar
MocnikG
 
Prispevkov: 493
Pridružen: 18 Maj 2015, 18:56
Kraj: Koroška - MB - CE
Zahvalil se je: 47 krat
Prejel zahvalo: 78 krat
Uporabnika povabil: s55ei
Število neizkoriščenih povabil: 7

Re: C++ objektno in razredi

OdgovorNapisal/-a Kroko » 25 Avg 2018, 13:28

Tako je. Inicializacija je narejena tko kot treba.
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4805
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 684 krat
Prejel zahvalo: 1665 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255


Vrni se na Programski jeziki

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost