Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Beste Umsetzung für read/write von Attributen in C++ (https://www.delphipraxis.net/28696-beste-umsetzung-fuer-read-write-von-attributen-c.html)

Assarbad 28. Aug 2004 15:34


Beste Umsetzung für read/write von Attributen in C++
 
Hiho,

wenn ich soetwas wie Heading in diesem Listing in C++ verwirklichen will, wie löst man das am besten?

Delphi-Quellcode:
type

  THeading = 0..359;
  TCompass = class(TControl)
  private
    FHeading: THeading;
    procedure SetHeading(Value: THeading);
  published
    property Heading: THeading read FHeading write SetHeading;
    ...
  end;
Definitiv geht's mit read, aber beide zugleich sieht doch mau aus, oder?

Eisenherz 30. Aug 2004 10:35

Re: Beste Umsetzung für read/write von Attributen in C++
 
Mit welchem C++ arbeitest du?

Wenn du mit dem C++Builder arbeitest, dann kannst du das 1 zu 1 umsetzen, siehe Schlüsselwort __property

Wenn du mit Ansi C++ arbeitest, dann schreibst du einfach eine public Getter- und Settermethode.

OregonGhost 30. Aug 2004 10:49

Re: Beste Umsetzung für read/write von Attributen in C++
 
Visual C++ unterstützt ebenfalls Properties, ich glaube, das Schlüsselwort heißt auch was mit property. Sei dir aber dessen bewusst, dass es in der Sprache ISO-C++ keine Eigenschaften gibt und du dich mit dem Nutzen dieser Funktionen an einen Compiler bindest.
Alternativ kannst du C++.NET verwenden, da gibt es natürlich Eigenschaften...

NicoDE 30. Aug 2004 11:04

Re: Beste Umsetzung für read/write von Attributen in C++
 
Die 'Properties' gibt es nur in 'managed C++' (die Zuordnung wird durch eine Nomenklatur automatisiert).

OregonGhost 30. Aug 2004 11:09

Re: Beste Umsetzung für read/write von Attributen in C++
 
Zitat:

Zitat von NicoDE
Die 'Properties' gibt es nur in 'managed C++' (die Zuordnung wird durch eine Nomenklatur automatisiert).

Zitat:

Zitat von MSDN Library von Visual Studio 6
Microsoft Specific —>

__declspec( property( get=get_func_name ) ) declarator

__declspec( property( put=put_func_name ) ) declarator

__declspec( property( get=get_func_name, put=put_func_name ) ) declarator

This attribute can be applied to non-static “virtual data members„ in a class or structure definition. The compiler treats these “virtual data members„ as data members by changing their references into function calls.

When the compiler sees a data member declared with this attribute on the right of a member-selection operator (“.„ or “->“), it converts the operation to a get or put function, depending on whether such an expression is an l-value or an r-value. In more complicated contexts, such as “+=“, a rewrite is performed by doing both get and put.

This attribute can also be used in the declaration of an empty array in a class or structure definition. For example:

__declspec(property(get=GetX, put=PutX)) int x[];
The above statement indicates that x[] can be used with one or more array indices. In this case, i=p->x[a][b] will be turned into i=p->GetX(a, b), and p->x[a][b] = i will be turned into p->PutX(a, b, i);

END Microsoft Specific


NicoDE 30. Aug 2004 11:20

Re: Beste Umsetzung für read/write von Attributen in C++
 
OK, dann hab ich wohl was verpasst (nunja nicht wirklich, weil 'Microsoft specific' :)).

OregonGhost 30. Aug 2004 11:33

Re: Beste Umsetzung für read/write von Attributen in C++
 
Naja, ob nun Microsoft specific oder Borland specific - beides nicht so prickelnd. ISO-C++ hat nunmal keine Eigenschaften. Also entweder man schreibt plattformunabhängigen Code, indem man die Eigenschaften durch Getter/Setter-Methoden ersetzt (gegebenenfalls kann man da ein paar schmutzige Makros für schreiben (C; ), oder man muss sich halt an den Borland- oder Microsoft-Compiler anschmiegen.

Übrigens gibt es noch eine verbreitete Syntax für C++-"Eigenschaften", wie ich kürzlich in einer Diskussion auf Gamedev.net erfuhr.
Wenn die Eigenschaft z.B. Value heißt und int ist:

Code:
class MyClass
{
    int value;
public:
    int Value() { return value; }
    void Value(int newValue) { value = newValue; }
}
und dann benutzen wie folgt:
Code:
MyClass mc;
mc.value(1);
cout << mc.value();
Das kommt zumindest ungefähr der Benutzung von Eigenschaften gleich, auch wenn man nicht so schöne Syntax hat. Ist aber fast noch ein wenig schöner als get/set.
Ich weiß nicht mehr, ob das dieser Thread war, aber da stellt auch einer seine Template-Bibliothek für Eigenschaften vor. Auch eine Möglichkeit.

Robert_G 30. Aug 2004 11:43

Re: Beste Umsetzung für read/write von Attributen in C++
 
Ich finde get/set gar nicht soooo schlimm. ;)
In C# würde es ungefähr so aussehen (soory, bin kein C++ crack :duck: ):
Code:
public class Compass : System.Windows.Forms.Control
{
    private Int16 fHeading;
    public Int16 Heading
    {
        get { return fHeading; }
        set
        {
            if ( value >= 0 && value < 360 )
                fHeading = value;
            else
            {
                throw new System.IndexOutOfRangeException("Some message...");
            }
        }
    }
}

Assarbad 30. Aug 2004 14:22

Re: Beste Umsetzung für read/write von Attributen in C++
 
Zitat:

Zitat von OregonGhost
Sei dir aber dessen bewusst, dass es in der Sprache ISO-C++ keine Eigenschaften gibt und du dich mit dem Nutzen dieser Funktionen an einen Compiler bindest.

Eben, C++, nicht irgendeinen Dialekt. Das Programm soll auf beliebigen Plattformen laufen.

Assarbad 30. Aug 2004 23:41

Re: Beste Umsetzung für read/write von Attributen in C++
 
Zitat:

Zitat von NicoDE
OK, dann hab ich wohl was verpasst (nunja nicht wirklich, weil 'Microsoft specific' :)).

Naja, wenn man C++ sagt, geht man ja auch nicht davon aus, daß "proprietary extensions" besprochen werden *g* ich zumindest nicht.

@Nico: Das IDA 4.7-Update ist sehr "lecker" *mjam mjam* :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz