【问题标题】:Possible to convert C# get,set code to C++可以将 C# 获取、设置代码转换为 C++
【发布时间】:2013-07-31 02:13:51
【问题描述】:

我在 C# 中有以下代码:

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

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

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

我收到的错误出现在第一个“{”上,说明 expected a ';'。有关如何解决它的任何建议?

【问题讨论】:

标签: c# c++ visual-studio-2010 visual-c++


【解决方案1】:

您使用的是 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();
  }

【讨论】:

  • 在后一种情况下,标准命名约定似乎是 T temp() 用于获取器,void temp(T value) 用于设置器。
  • @CodesInChaos 我肯定见过两种方式(获取/设置前缀和无前缀)。我个人的偏好是使用 Get / Set 前缀,这可能是我早期 Java 时代的保留
【解决方案2】:

复制粘贴一个类似问题的答案:

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

是的,这是可能的:)

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;

【讨论】:

  • 请注意,以这种方式使用的属性会使类比其他方式大一点
  • @MooingDuck,正确 - 但我也建议首先这样做,因此最重要的免责声明 - 它可以完成......只是......是的......;)
  • TestTest::operator= 的复制结构是灾难性的。你要么妥善处理,要么阻止。
  • 哦,您可以摆脱开销,只需放弃 . 语法即可使用 operator=。使用static TestProperty text; 将名称引入全局范围,并适当覆盖operator^,您可以让a^text = "blah" 工作,运行时间开销为零。为了增加 C#ness,Test* a; a^textTest a; a^text 都可以做同样的事情:为什么要存储 Test 对象,而语句 就在那里,我们需要做的就是一些表达式模板 mojo 来抓取它并使用它!
【解决方案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();
    }

【讨论】:

  • 但是,最好直接使用get_Temp/set_Temp,而不使用属性Temp,因为使用grep 访问/修改Temp 的位置更容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多