 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Markus Schaaf Guest
|
Posted: Sat Dec 02, 2006 10:12 am Post subject: Re: Design: Pointer und Exceptions |
|
|
"Sönke Müller-Lund" <s.mueller-lund (AT) mobilcom (DOT) de> schrieb:
| Quote: | PS: Kann man einen auto_ptr sinnvoll über return weiterreichen?
|
Vermutlich wurde er genau dafür entwickelt. |
|
| Back to top |
|
 |
Nils Guest
|
Posted: Sat Dec 09, 2006 8:13 am Post subject: Re: Portables Multithreading? |
|
|
und ptypes |
|
| Back to top |
|
 |
Thomas Thiele Guest
|
Posted: Mon Dec 18, 2006 7:43 pm Post subject: Re: wie kann man eine zahl in c++ umrunden? |
|
|
kolesnyk schrieb:
| Quote: | hallo, alle zusamen!
Hab angefangen mit C++.
Könnte mir bitte jemand sagen wie ich ergebnis von einer multiplikation, summe oder devierdieren umrunden kann z.B. k=2*PI.
Danke im voraus. Und Entschuldigung für mein schlechtes deutsch.
|
Du meinst runden?
Genauso wie in anderen Sprachen auch.
double result = foo * PI;
double roundedResult static_cast<double>( static_cast<int>(result * N + 0.5) ) / N;
Wobei N = 10 für Runden auf eine Stelle nach dem Komma.
N = 100 für zwei Stellen hinter Komma usw. |
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Tue Dec 19, 2006 5:19 am Post subject: Re: wie kann man eine zahl in c++ umrunden? |
|
|
Thomas Thiele wrote:
| Quote: | kolesnyk schrieb:
hallo, alle zusamen!
Hab angefangen mit C++.
Könnte mir bitte jemand sagen wie ich ergebnis von einer multiplikation,
summe oder devierdieren umrunden kann z.B. k=2*PI. Danke im voraus. Und
Entschuldigung für mein schlechtes deutsch.
Du meinst runden?
Genauso wie in anderen Sprachen auch.
|
In anderen Sprachen gibt's in der Regel eine Standardfunktion dafür.
| Quote: | double result = foo * PI;
double roundedResult =
static_cast<double>( static_cast<int>(result * N + 0.5) ) / N;
Wobei N = 10 für Runden auf eine Stelle nach dem Komma.
N = 100 für zwei Stellen hinter Komma usw.
|
Das geht aber gewaltig in die Hose, wenn der Wert negativ ist oder außerhalb
des Bereichs für int liegt. |
|
| Back to top |
|
 |
Thomas Thiele Guest
|
Posted: Tue Dec 19, 2006 9:17 pm Post subject: Re: wie kann man eine zahl in c++ umrunden? |
|
|
Rolf Magnus schrieb:
| Quote: | Das geht aber gewaltig in die Hose, wenn der Wert negativ ist oder außerhalb
des Bereichs für int liegt.
|
Ja du hast recht, das war nur für den Positivfall.
Falls Integer (oder longs) nicht ausreichen, musst du halt was mit floor
und ceil basteln. |
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Wed Dec 20, 2006 9:36 pm Post subject: Re: wie kann man eine zahl in c++ umrunden? |
|
|
Thomas Thiele wrote:
| Quote: | Rolf Magnus schrieb:
Das geht aber gewaltig in die Hose, wenn der Wert negativ ist oder außerhalb
des Bereichs für int liegt.
Ja du hast recht, das war nur für den Positivfall.
Falls Integer (oder longs) nicht ausreichen, musst du halt was mit floor
und ceil basteln.
|
C99 hat schon eine Funktion round(). Sie wurde bereits in C++
übernommen, und wird sicher in der nächsten Version der Norm
erscheinen. Ich kann mir es auch nicht vorstellen, dass ein
aktueller Compiler sie nicht schon jetzt unterstützt.
--
James Kanze (GABI Software) email:james.kanze (AT) gmail (DOT) com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34 |
|
| Back to top |
|
 |
deelBlue Guest
|
Posted: Mon Dec 08, 2008 1:42 am Post subject: Re: Virtual Deconstructor |
|
|
Vielen Dank, ich habe es kapiere,
neben bei, wäre es nicht schön wenn man ein Schlüsselwort wie
"implement" aus Java in C++ gibt (es ist ja Weihnachten, man darf sich was
wünschen).
LG
Deel |
|
| Back to top |
|
 |
Helge Kruse Guest
|
Posted: Mon Dec 08, 2008 1:23 pm Post subject: Re: Virtual Deconstructor |
|
|
"deelBlue" <deel007 (AT) hotmail (DOT) com> wrote in message
news:6pqh6oF9gnc2U1 (AT) mid (DOT) dfncis.de...
| Quote: | Ich habe folgende Bespiele: Ein Klasse von Typ Base1 mit einem virtuellen
Dekonstruktor und eine Klasse Base2 sie erbt von Base1 aber der
Dekonstruktor von Base2 ist nicht virtuelle und dann ein Klasse Kind die
erbt von Base2.
Meine Frage sollte der Dekonstruktor von Base2 nicht virtuelle deklariert
werden?
Für den Compiler ist's egal, da eine Methode immer virtuell ist, wenn sie in |
der Basisklasse bereits virtuell ist. Zur besseren Lesbarkeit schreibe ich
aber trotzdem auch in abgeleiteten Klassen das virtuell hin.
| Quote: | An bei mein Testprogramm:
[...]
Ausgabe:
"Destructor Base1"
"Destructor Base2"
"Destructor Kind"
|
Welchen Compiler benutzt Du? Wenn es ein normal funktionierender Compiler
wäre, sollte das in dieser Reihenfolge erscheinen:
Destructor Kind
Destructor Base2
Destructor Base1
Hintergrund: Im Constructor und im Destructor einer abgeleiteten Klasse kann
man sich darauf verlassen, dass die Member der Basisklasse intakt sind. Dazu
werden beim Constructor zuerst die Basisklassen-Construktoren und danach die
der abgeleiteten Klassen aufgerufen. Beim Destruktor erfolgt das anders
herum um das gleiche Paradigma zu erfüllen.
Weiterhin wird die vtable jeweils so gesetzt, dass die dann zugehörigen
virtuellen Methoden aufgerufen werden.
Gruß,
Helge |
|
| Back to top |
|
 |
Guest
|
Posted: Tue Dec 09, 2008 9:09 pm Post subject: Re: Virtual Deconstructor |
|
|
On 7 Dez., 20:42, "deelBlue" <deel...@hotmail.com> wrote:
| Quote: | neben bei, wäre es nicht schön wenn man ein Schlüsselwort wie
"implement" aus Java in C++ gibt (es ist ja Weihnachten, man darf sich was
wünschen).
|
Sicherlich darfst du dir das wuenschen ;-)
Aber welchen Effekt soll es in C++ haben? Das, was man in Java/C# mit
einem Interface beschreibt, ist in C++ eine *virtuelle* Basisklasse,
sie wird
also z.B. so deklariert und implementiert:
#include <string>
class IMyInterface {
public:
virtual ~IMyInterface();
virtual std::string to_string() const = 0;
virtual IMyInterface* clone() const = 0;
virtual void transmutate() = 0;
};
IMyInterface test; // Fehler, kann abstrakte Klasse nicht
instantiieren
// Implementation:
class MyImpl : public virtual IMyInterface {
virtual std::string to_string() const { return "MyImpl"; }
virtual IMyInterface* clone() const { return new MyImpl(*this); }
virtual void transmutate(){}
};
MyImpl test2; // OK
Es stimmt schon, ohne eine Art Instantiierungstest kannst du
das nicht pruefen. In diesem Fall haettest du das aber schon
dadurch gemerkt, dass die clone()-Funktion nicht kompiliert
haette, weil natuerlich auch hier gilt, dass eine abstrakte Klasse
nicht instantiiert werden kann.
Das Schluesselwort virtual bei der Angabe der Basisklasse
sorgt dafuer, dass das IMyInterface-Subjekt nur einmal innerhalb
der Klassenhierachie eines bestimmten Typs vorkommt, genauso,
wie man bei einem Java-Interface beliebig viele Erweiterungen
innerhalb
einer Klassenhierachie haben kann, ohne, dass man Uneindeutigkeiten
aufloesen muesste (weil das Interface sich so verhaelt, als wuerde
es genau einmal in einem bestimmten Gesamtobjekt da sein, auch
wenn mehrere andere Interface dieses Interface erweitern).
Gruss aus Bremen,
Daniel Krügler |
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Wed Dec 10, 2008 8:29 am Post subject: Re: Virtual Deconstructor |
|
|
On Dec 7, 8:42 pm, "deelBlue" <deel...@hotmail.com> wrote:
[...]
| Quote: | neben bei, wäre es nicht schön wenn man ein Schlüsselwort wie
"implement" aus Java in C++ gibt (es ist ja Weihnachten, man
darf sich was wünschen).
|
Wozu? Auch in Java ist es einigermaßen überflussig; wozu dieser
künstliche Unterschied zwischen »extends« und »implements«?
(Und noch grundlegender, wozu dieser künstliche Unterschied
zwischen »class« und »interface«?)
--
James Kanze (GABI Software) email:james.kanze (AT) gmail (DOT) com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34 |
|
| Back to top |
|
 |
Christoph Kliemt Guest
|
Posted: Thu Dec 11, 2008 12:55 am Post subject: Re: Virtual Deconstructor |
|
|
James Kanze <james.kanze (AT) gmail (DOT) com> writes:
| Quote: | On Dec 7, 8:42 pm, "deelBlue" <deel...@hotmail.com> wrote:
[...]
neben bei, wäre es nicht schön wenn man ein Schlüsselwort wie
"implement" aus Java in C++ gibt (es ist ja Weihnachten, man darf
sich was wünschen).
Wozu? Auch in Java ist es einigermaßen überflussig; wozu dieser
künstliche Unterschied zwischen »extends« und »implements«? (Und noch
grundlegender, wozu dieser künstliche Unterschied zwischen »class« und
»interface«?)
|
Weil sie beim Entwurf von java kein
<jehova>multiple inheritance</jehova> haben wollten, weil is fuer
Progger Smith zu kompliziert.
Und dann ging es dann doch nicht so ganz ohne...
Christoph |
|
| Back to top |
|
 |
deelBlue Guest
|
Posted: Thu Dec 11, 2008 1:57 am Post subject: Re: Virtual Deconstructor |
|
|
| Quote: | Wozu? Auch in Java ist es einigermaßen überflussig; wozu dieser
künstliche Unterschied zwischen »extends« und »implements«?
(Und noch grundlegender, wozu dieser künstliche Unterschied
zwischen »class« und »interface«?)
nun ja eine Interface steht nur für eine Schnittstelle und keine |
Implementierung und ich finde es schon sinnvoll, daß man zwischen die
Konformität zu einer Schnittstelle und die Vererbung von einer
Implementation unterscheidet. |
|
| Back to top |
|
 |
Guest
|
Posted: Fri Dec 12, 2008 7:00 am Post subject: Re: Virtual Deconstructor |
|
|
On 9 Dez., 22:09, daniel.krueg...@googlemail.com wrote:
| Quote: | On 7 Dez., 20:42, "deelBlue" <deel...@hotmail.com> wrote:
neben bei, wäre es nicht schön wenn man ein Schlüsselwort wie
"implement" aus Java in C++ gibt (es ist ja Weihnachten, man darf sich was
wünschen).
Sicherlich darfst du dir das wuenschen ;-)
Aber welchen Effekt soll es in C++ haben? Das, was man in Java/C# mit
einem Interface beschreibt, ist in C++ eine *virtuelle* Basisklasse,
sie wird
also z.B. so deklariert und implementiert:
#include <string
class IMyInterface {
public:
virtual ~IMyInterface();
virtual std::string to_string() const = 0;
virtual IMyInterface* clone() const = 0;
virtual void transmutate() = 0;
};
|
Kleine Korrektur (Danke, "deelBlue" fuer den Hinweis):
Hier fehlt die Destruktordefinition von IMyInterface.
Am einfachsten fuer das Beispiel waere eine inline-
Definition:
class IMyInterface {
public:
virtual ~IMyInterface(){}
....
};
Alternativ laesst sich auch der Destruktor als abstrakte Funktion
deklarieren:
class IMyInterface {
public:
virtual ~IMyInterface() = 0;
....
};
In diesem Fall *muss* trotzdem eine entsprechende
Definition bereitgestellt werden. Der Einfachheit halber
hier inline:
inline IMyInterface::~IMyInterface(){}
aber normalerweise wuerde man den Destruktor als
nicht-inline-Funktion in einer separaten .cpp bereitstellen.
Gruss aus Bremen,
Daniel Krügler |
|
| Back to top |
|
 |
Thomas Thiele Guest
|
Posted: Fri Dec 12, 2008 11:17 am Post subject: Re: Virtual Deconstructor |
|
|
On 10 Dez., 09:29, James Kanze <james.ka...@gmail.com> wrote:
| Quote: | Wozu? Auch in Java ist es einigermaßen überflussig; wozu dieser
künstliche Unterschied zwischen »extends« und »implements«?
|
Weil Java eine unlogisch zusammengeschusterte Sprache aus
halbverstandenem C++ ist!
Man wollte keine mulitplen Ableitungen, weil die ja so böööööse
sind, erkannte aber dass man sie oft braucht um Interfaces anzubieten.
Was ja die Hauptanwendung mulipler Ableitungen ist.
Und da kam dann das "implements" zur Hintertür rein.
Das hat nicht nur programmiertechnische Unterschiede sondern
viel schlimmer noch(!) - es lässt Leute die OOP mit Java beginnen
so denken! Java versaut das OOP-Denken, finde ich. |
|
| Back to top |
|
 |
deelBlue Guest
|
Posted: Sat Dec 13, 2008 8:03 pm Post subject: Re: Virtual Deconstructor |
|
|
| Quote: | Welchen Compiler benutzt Du? Wenn es ein normal funktionierender Compiler
wäre, sollte das in dieser Reihenfolge erscheinen:
Destructor Kind
Destructor Base2
Destructor Base1
Danke du hast vollkommen Recht, ich habe es falsch geschrieben. |
|
|
| Back to top |
|
 |
Powered by phpBB © 2001, 2006 phpBB Group
|