2013-07-30 12 views
20

Mam następujący kod w języku C#:możliwe do konwersji C# get ustawić kod do C++

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

Czy to możliwe, aby przekształcić to i użyć GET i ustawić w ten sposób? Wiem, że nie można zadeklarować jak tak i muszę „:” zadeklarować ale gdy próbuję to zrobić:

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

Błąd zgłaszany jest na pierwszym „{” stwierdzając expected a ';'. Wszelkie sugestie, jak to naprawić?

+14

Moderator ** Uwaga: ** To pytanie już dobiegł końca. Jeśli chcesz skomentować jego prawdziwość, zanieś go do [meta post] (http://meta.stackexchange.com/questions/191089/why-do-we-let-host-users-users-dictate-the-perception- przepełnienia stosu). Dzięki. –

+1

Możliwy duplikat [podobnych do C# właściwości w natywnym C++?] (Http://stackoverflow.com/questions/4225087/c-like-properties-in-native-c) –

Odpowiedz

37
Czy używasz C++/CLI? Jeśli tak, to jest to składnia właściwości

Jeśli próbujesz użyć normalnego C++, oznacza to, że masz pecha. Nie ma podobnej funkcji dla normalnego kodu C++. trzeba będzie uciekać się do metod getter i setter

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

W tym drugim przypadku wydaje się, że standardowa konwencja nazewnictwa dla 'T temp()' dla gettera i 'void temp (wartość T)' dla ustawiacza. – CodesInChaos

+0

@CodesInChaos Zdecydowanie widziałem oba sposoby (prefiks Get/Set i bez prefiksu). Moje osobiste preferencje to posiadanie prefiksu Get/Set, być może wstrzymanie z moich wczesnych dni Java. – JaredPar

11

Aby skopiować wkleić jeden z moich odpowiedzi z podobnym pytaniem:

UWAGA: Jest to reakcja tongue-in-cheek i jest straszne !! !

Tak, to rodzaj możliwe :)

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() 
}; 

Następnie zadeklarować swoją klasę, deklarowania właściwości dla swoich członków:

class Test 
{ 
private: 
    std::string m_Test; 

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

    Property<std::string> text; 
}; 

I wywołać C# stylu!

Test a; 
a.text = "blah"; 

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

Należy pamiętać, że Właściwości w ten sposób sprawiają, że klasa jest trochę większa niż w innym przypadku, gdyby były one w innym przypadku –

+0

@MooingDuck, ale ja bym to zrobił także radzę robić to w pierwszej kolejności, stąd wyłączenie z najwyższego punktu - to * może * być zrobione ... po prostu ... tak ...;) –

+2

+1, to jest zarówno złe, jak i sprytne :) – JaredPar

3

W Visual C++ można użyć __declspec(property) coś takiego:

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

Jednak lepiej użyć po prostu 'get_Temp/set_Temp' bezpośrednio, bez właściwości' Temp', ponieważ jest to o wiele łatwiejsze przeglądanie miejsc, w których Temp jest dostępny/modyfikowany. – Abyx