ubuntuusers.de

C++ "leere" Klasse erzeugen - geht das?

Status: Ungelöst | Ubuntu-Version: Ubuntu MATE 22.04 (Jammy Jellyfish)
Antworten |

Dakuan

Avatar von Dakuan

Anmeldungsdatum:
2. November 2004

Beiträge: 6450

Wohnort: Hamburg

Es geht darum, dass ich in einer Klasse anhand verschiedener Bedingungen einen String erzeuge, der bei Bedarf in eine Kommandozeile für ein externes Programm eingefügt wird. Das funktioniert auch erstmal.

Bei dem externen Programm handelt es sich um mpv. Die ausgewählten Parameter funktionieren aber so nicht für vlc und gleichwertige Entsprechungen habe ich auf die Schnelle nicht gefunden.

Daher möchte ich optional dies externe Klasse weg lassen, ohne aber dafür mein Makefile ändern zu müssen. Ich möchte das einfach nur über einen Compiler Switch in der Hauptdatei ändern können. Geht das so überhaupt?

Ich gehe mal davon aus, dass die entsprechenden Quelltexte, auch wenn sie nicht verwendet werden, übersetzt und auch zur ausführbaren Datei hinzugelinkt werden, was ich doof finde.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17583

Wohnort: Berlin

Disclaimer: Ich habe über 20 Jahre kein C++ mehr gemacht, außer "Hello World"-Äquivalente.

Du könntest doch die optionale Klasse zu Objectcode compilieren, einem .so-File zufügen, und in Abhängigkeit von einem ~rc-/~conf-Fileeintrag oder einem Startparameter des Programms die Klasse laden oder nicht, oder?

Oder in Abhängigkeit von der Verfügbarkeit dieser Library die Klasse laden/benutzen. Da weiß ich aber nicht, wie man das in C++ macht.

Dakuan

(Themenstarter)
Avatar von Dakuan

Anmeldungsdatum:
2. November 2004

Beiträge: 6450

Wohnort: Hamburg

Disclaimer: Ich habe über 20 Jahre kein C++ mehr gemacht, außer "Hello World"-Äquivalente.

Und ich mache erst seit ca. 10 Jahren (notgedrungen) in C++ und tue mich damit immer noch schwer.

Du könntest doch die optionale Klasse zu Objectcode compilieren, einem .so-File zufügen, ...

Also um (eigene) .so Files hatte ich bisher immer einen Bogen gemacht. Aus praktischen Gründen. Die Funktionssammlungen, die dafür in Frage kommen, unterliegen noch zu vielen Veränderungen.

Oder in Abhängigkeit von der Verfügbarkeit dieser Library die Klasse laden/benutzen. Da weiß ich aber nicht, wie man das in C++ macht.

Über dynamisches laden von Libs hatte ich auch schon mal nachgedacht. Wäre hier aber wohl nicht die einfachste Lösung.

Dazu muss ich anmerken, dass ich das FLTK Toolkit verwende, und dass ich in der Vergangenheit da auch mal bei der Beseitigung von zwei bis drei Bugs mitgeholfen hatte. Das geht (hier) nur, wenn man den Quelltext direkt verfügbar hat (da werden nur patch Dateien ausgetauscht), weswegen ich das immer statisch gelinkt hatte, was *.so ausschließt.

Ich hatte gehofft, dass man da irgendwie eine .o Datei erstellen könnte, die einfach nur aus Nullpointer oder so besteht, also dass der nicht benötigte Objectcode nicht oder nur in einer minimalen dummy Version eingelinkt wird. Also dass Compiler und Linker zufrieden sind ohne dass ich da weiter etwas machen muss.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13075

Dakuan schrieb:

Es geht darum, dass ich in einer Klasse anhand verschiedener Bedingungen einen String erzeuge, der bei Bedarf in eine Kommandozeile für ein externes Programm eingefügt wird. Das funktioniert auch erstmal.

Du hast also eine Klasse, die irgendeinen Zustand in Kommandozeilenparameter für einen externen Prozess übersetzt.

Bei dem externen Programm handelt es sich um mpv. Die ausgewählten Parameter funktionieren aber so nicht für vlc und gleichwertige Entsprechungen habe ich auf die Schnelle nicht gefunden.

Daher möchte ich optional dies externe Klasse weg lassen, ohne aber dafür mein Makefile ändern zu müssen. Ich möchte das einfach nur über einen Compiler Switch in der Hauptdatei ändern können. Geht das so überhaupt?

Ich verstehe nicht so recht, was die Bedingung dafür ist, dass die Klasse verwendet wird oder nicht. Ich hätte jetzt eher erwartet, dass es eine abstrakte Klasse und je eine Klasse pro externen Programm gibt, die irgendwelchen Zustand in Kommandozeilenparameter für dieses spezielle Binary übersetzt. Zur Laufzeit wird dann entschieden, welche dieser Klassen Du instantiierst.

Ich gehe mal davon aus, dass die entsprechenden Quelltexte, auch wenn sie nicht verwendet werden, übersetzt und auch zur ausführbaren Datei hinzugelinkt werden, was ich doof finde.

Wieso? Der Platzbedarf wird minimal sein. Ich halte das für eine völlig voreilige ("premature") Optimierung.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4650

Wohnort: Berlin

Ich würde mich da rklm anschliessen und den Sinn in Frage stellen.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17583

Wohnort: Berlin

Dakuan schrieb:

Ich hatte gehofft, dass man da irgendwie eine .o Datei erstellen könnte, die einfach nur aus Nullpointer oder so besteht, also dass der nicht benötigte Objectcode nicht oder nur in einer minimalen dummy Version eingelinkt wird. Also dass Compiler und Linker zufrieden sind ohne dass ich da weiter etwas machen muss.

Hm. In Java/Scala habe ich mal die Idee einer Nullklasse gesehen, die einem womöglich ähnlichen Zweck diente. Nach außen stellt sie alles zur Verfügung, was die richtige Klasse zur Verfügung stellen würde, aber tut nichts.

Je nach dem was die Problemlage ist, könnte das bei Dir auch klappen.

Du musst in Scenario A die Klasse Indiskutabel aufrufen, aber hast Scenario A gar nicht, sondern Scenario B. Das riecht für mich auch nach einer gemeinsamen Oberklasse, aber als notgedrungener Hack wäre unter Umständen eine TuNixKlasse als Ersatz denkbar. Es müsste halt sicher gestellt werden, dass niemand auf Attribute zugreift, die null sind, und wenn Methoden aufgerufen werden, dass sie etwas zurückliefern, wenn sie müssen, das garantiert harmlos ist.

Wenn die Methoden eh nur Seiteneffekte haben, dann sollten es leere Methodenaufrufe tun.

Eventuell musst Du ein einsames, verlassenes Semikolon in den Methodenrumpf schreiben, als NOP, da bin ich in der Syntax nicht mehr drin.

 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
class FooBarKomplexManager {
	int i;
	char** str;
	float f;
	double d;

	public:
	    FooBarKomplexManager (int ip, char** sp, float fp, double dp)
	    {
			i = ip;
			str = sp;
			f = fp;
			d = dp;
	    }
		FooBarKomplexManager ()
		{

		}
	    /** maybe more Code which is
	      - slow or
	      - uses much memory
	      - needs a costly license
	      - ...
	    */
};

// fake Indiskutabel, only useful, to circumvent a situation, where you need an Indiskutabel pro forma.
class Indiskutabel {

     public:
         void mandatory (FooBarKomplexManager fbkm)
         {
             // ; no semicolon needed
         }
};

#include <iostream>

using namespace std;

// ... usage:

int main (void)
{
	Indiskutabel idkt = Indiskutabel ();
	FooBarKomplexManager fbkpm;
	idkt.mandatory (fbkpm);
	cout << "Successfully called the mandatory method\n" ;
}

Ohne Gewähr, aber ausprobiert, mit und ohne solitäres Semikolon. FooBarKompleManager ist nur da, damit es imposanter aussieht. In Java könnte man idkt.mandatory (null); aufrufen, da kenne ich die äquivalente c++-Syntax nicht.

Dakuan

(Themenstarter)
Avatar von Dakuan

Anmeldungsdatum:
2. November 2004

Beiträge: 6450

Wohnort: Hamburg

Also eigentlich ist das eher so etwas wie eine Konfiguration. Vieles dafür kann ich über bedingte Compilierung steuern. Aber nicht das Makefile.

Ich will, zumindest während der Experimentierphase, nicht mehrmals am Tag auch noch das Makefile ändern müssen.

... als notgedrungener Hack wäre unter Umständen eine TuNixKlasse als Ersatz denkbar.

das könnte eine einfache Lösung sein ...

... Es müsste halt sicher gestellt werden, dass niemand auf Attribute zugreift, die null sind, ...

Das ist recht einfach realisierbar. Die Klasse bekommt einen String, analysiert den und gibt dann einen String zurück, der, wenn er nicht Null ist, in die Kommandozeile eingebaut werden kann. Als eigene Klasse wollte ich das haben, weil später noch ein Einstellfenster dafür geplant ist (was die eigentliche Anwendung aber nichts angeht).

Die hauptsächliche Methode "make_option_string()" müsste dann immer einen Nullzeiger zurückgeben, was aber eigentlich auch überflüssig ist, da sie wegen bedingter Kompilierung nicht aufgerufen wird.

Bisher mache ich da so:

1
2
3
4
5
6
7
8
9
...
    #ifdef USE_XOPTIONS
    XPlayerOptions * xoptions;
    #endif
...
    #ifdef USE_XOPTIONS
    xoptions = new XPlayerOptions();
    #endif
...

Aber das Makefile arbeitet das natürlich trotzdem ab und wirft manchmal auch Fehlermeldungen.

Antworten |