2013-07-30 23 views
20

için kod dönüştürmek için ben C# Aşağıdaki kod:Olası C#, set olsun C++

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

bu dönüştürmek ve get kullanmak ve bu şekilde ayarlamak mümkün mü? Sana şöyle ilan edemeyeceğini biliyoruz ve ihtiyacım ":" Bunu çalıştığınızda beyan fakat:

"{" ilk expected a ';' belirten üzerine
public: 
     std::string Temp 
     { 
     get { return sTemp; } 
     set { 
       sTemp = value; 
       this.ComputeTemp(); 
      } 

aldığım hatadır. Nasıl düzeltileceğine dair herhangi bir öneriniz var mı?

+14

** Moderatör Not: ** Bu soru zaten yolunda gitmeyebilir. Doğruluğu hakkında yorum yapmak isterseniz, [meta post] 'a (http://meta.stackexchange.com/questions/191089/why-do-we-let-hostile-users-dictate-the-perception- of-yığın taşma). Teşekkürler. –

+1

Olası yinelenen [C# benzeri özellikleri yerel C++?] (Http://stackoverflow.com/questions/4225087/c-like-properties-in-native-c) –

cevap

37

C++/CLI kullanıyor musunuz? Normal C kullanmaya çalışıyorsanız bu nedenle bu özellik söz dizimi

public: 
    property std::string Temp { 
    std::string get() { return sTemp; } 
    void set(std::string value) { sTemp = value; this->ComputeTemp(); } 
    } 

ise ++ o zaman şans dışında. Normal C++ kodu için eşdeğer bir özellik yoktur. Sen benzer bir soruya benim cevap birini yapıştırmak kopyalamak için alıcı ve ayarlayıcı yöntemlerinin

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

İkinci durumda, standart adlandırma kuralı görünüyor setter için getter ve 'void temp (T value)' için T temp(). – CodesInChaos

+0

@CodesInChaos Kesinlikle iki yolu da gördüm (Get/Set öneki ve önek yok). Benim kişisel tercihim, Get/Set önekine sahip olmak, belki de benim erken Java günlerimden bir bekleyişe sahip olmaktır. – JaredPar

11

başvurmak gerekir:

UYARI: Bu dil-yanak yanıttır ve korkunç !! !

Evet, bir anlamda mümkündür :)

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

Sonra üyeleri için özelliklerini bildirmek, sınıfınızı beyan:

class Test 
{ 
private: 
    std::string m_Test; 

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

    Property<std::string> text; 
}; 

ve C# stili diyoruz! Böyle __declspec(property) kullanabilirsiniz Visual C++

Test a; 
a.text = "blah"; 

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

Bu özellik, bu sınıfın sınıfının –

+0

@MooingDuck'undan biraz daha büyük olduğunu unutmayın. Ayrıca, ilk etapta bunu yapma tavsiyesinde bulunmaktayız, dolayısıyla üst - noktadaki feragatname - it * yapılabilir * sadece .. evet ...;) –

+2

+1, hem kötülük hem de zeki :) – JaredPar

3

:

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

Ancak, 'Temp' özelliği olmadan doğrudan get_Temp/set_Temp' kullanmak daha iyidir, çünkü Temp erişiminin/değiştirildiği yerlerin greplenmesi daha kolaydır. – Abyx