2013-07-30 11 views
20

Ich habe den folgenden Code in C# konvertieren:Mögliche C# erhalten, setzen Sie Code in C++

public string Temp 
     { 
      get { return sTemp; } 
      set { 
       sTemp = value; 
       this.ComputeTemp(); 
      } 
     } 

Ist es möglich, diese zu konvertieren und verwenden, um die get und setzen Sie diese Art und Weise? Ich weiß, dass Sie nicht wie so erklären kann und ich brauche das „:“ zu erklären, aber wenn ich versuche, dies zu tun:

public: 
     std::string Temp 
     { 
     get { return sTemp; } 
     set { 
       sTemp = value; 
       this.ComputeTemp(); 
      } 

Der Fehler, den ich erhalten, ist auf den ersten „{“ expected a ';' besagt. Irgendwelche Vorschläge, wie man es repariert?

+14

** Moderator Hinweis: ** Diese Frage hat bereits seinen Lauf. Wenn Sie seine Wahrhaftigkeit kommentieren möchten, bringen Sie es zum [meta post] (http://meta.stackexchange.com/questions/191089/why-do-we-let-hostile-users-dictate-the-ception- Of-Stack-Überlauf). Vielen Dank. –

+1

Mögliches Duplikat von [C# -artigen Eigenschaften in nativem C++?] (Http://stackoverflow.com/questions/4225087/c-like-properties-in-native-c) –

Antwort

37

Verwenden Sie C++/CLI? Wenn dies der Fall ist, ist dies die Eigenschaftssyntax

Wenn Sie versuchen, normales C++ zu verwenden, dann haben Sie kein Glück. Es gibt keine gleichwertige Funktion für normalen C++ - Code. Sie müssen Getter und Setter-Methoden greifen

public: 
    std::string GetTemp() const { return sTemp; } 
    void SetTemp(const std::string& value) { 
    sTemp = value; 
    this->ComputeTemp(); 
    } 
+3

Im letzteren Fall scheint die Standardbenennungskonvention zu sein für den Getter "T temp()" und für den Setter "void temp (T-Wert)" sein. – CodesInChaos

+0

@CodesInChaos Ich habe definitiv beide Wege gesehen (Get/Set-Präfix und kein Präfix). Meine persönliche Präferenz ist das Get/Set-Präfix, möglicherweise ein Übergriff von meinen frühen Java-Tagen – JaredPar

11

zu kopieren, um eine meiner Antworten aus einer ähnlichen Frage einfügen:

ACHTUNG: Dies ist ein tongue-in-cheek Antwort und ist schrecklich !! !

Ja, es ist eine Art möglich :)

template<typename T> 
class Property 
{ 
private: 
    T& _value; 

public: 
    Property(T& value) : _value(value) 
    { 
    } // eo ctor 

    Property<T>& operator = (const T& val) 
    { 
     _value = val; 
     return(*this); 
    }; // eo - 

    operator const T&() const 
    { 
     return(_value); 
    }; // eo() 
}; 

dann Ihre Klasse deklarieren, Eigenschaften für Ihre Mitglieder erklärt:

class Test 
{ 
private: 
    std::string m_Test; 

public: 
    Test() : text(m_Test) 
    { 
    }; 

    Property<std::string> text; 
}; 

Und nennen C# Art!

Test a; 
a.text = "blah"; 

std::string content = a.text; 
+0

Beachten Sie, dass Eigenschaften auf diese Weise machen die Klasse ein wenig größer als sie sonst sein würden –

+0

@MooingDuck, richtig - aber ich würde rate auch, es in erster Linie zu tun, daher der Disclaimer an der Spitze sein - es * kann * getan werden ... nur .. ja ...;) –

+2

+1, das ist sowohl böse als auch clever :) – JaredPar

3

in Visual C++ Sie __declspec(property) wie folgt verwenden können:

public: 
    __declspec(property(get=get_Temp, put=set_Temp)) std::string Temp; 

    const std::string& get_Temp { return sTemp; } 
    void set_Temp(std::string value) { 
      sTemp = std::move(value); 
      this->ComputeTemp(); 
    } 
+0

Es ist jedoch besser, 'get_Temp/set_Temp' direkt zu verwenden, ohne die Eigenschaft' Temp', weil es viel einfacher ist, Orte zu tempern, auf die Temp zugegriffen/geändert wird. – Abyx