21

我在 C# 中有以下代码:

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

是否可以转换它并以这种方式使用获取和设置?我知道你不能这样声明,我需要“:”来声明,但是当我尝试这样做时:

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

我收到的错误是在第一个“{”声明expected a ';'中。关于如何修复它的任何建议?

4

3 回答 3

38

你在使用 C++/CLI 吗?如果是这样,这是属性语法

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

如果您尝试使用普通的 C++,那么您就不走运了。普通 C++ 代码没有等效功能。您将需要求助于 getter 和 setter 方法

public:
  std::string GetTemp() const { return sTemp; } 
  void SetTemp(const std::string& value) { 
    sTemp = value;
    this->ComputeTemp();
  }
于 2013-07-30T19:11:14.700 回答
11

要从类似问题中复制粘贴我的答案之一:

警告:这是一个半开玩笑的回应,太可怕了!!!

是的,这是可能的:)

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

然后声明你的类,为你的成员声明属性:

class Test
{
private:
    std::string m_Test;

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

    Property<std::string> text;
};

并调用 C# 风格!

Test a;
a.text = "blah";

std::string content = a.text;
于 2013-07-30T19:21:38.873 回答
3

在 Visual C++ 中,您可以使用__declspec(property),如下所示:

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();
    }
于 2013-07-31T04:59:48.533 回答