将get/set从C#转换为C++;,使用头文件

将get/set从C#转换为C++;,使用头文件,c#,c++,class,constructor,header,C#,C++,Class,Constructor,Header,作为前言,我正在重新创建一个旧游戏项目的基本框架。它是用C语言编写的,我正在尽最大努力把我所拥有的东西转化成C++。我也在使用Visual Studio Professional 2013。在这个例子中,我有一个坐标类,它可以动态地获取并设置X和Y属性的值。总而言之,这是相当直截了当的 这是C级: 这里是C++类和标题: //Coordinate.h #pragma once class Coordinate { public: Coordinate(int x, int y)

作为前言,我正在重新创建一个旧游戏项目的基本框架。它是用C语言编写的,我正在尽最大努力把我所拥有的东西转化成C++。我也在使用Visual Studio Professional 2013。在这个例子中,我有一个坐标类,它可以动态地获取并设置X和Y属性的值。总而言之,这是相当直截了当的

这是C级:

这里是C++类和标题:

//Coordinate.h
#pragma once
class Coordinate
{
public:
    Coordinate(int x, int y)
    {
        X = x;
        Y = y;
    }
    ~Coordinate();
    int X, Y;
};

//Coodinate.cpp
using namespace std;
#include "Coordinate.h"

Coordinate::Coordinate(int x, int y)
{
    Coordinate::X = x;
    Coordinate::Y = y;
}

Coordinate::~Coordinate()
{
}
凭借我有限的知识和经验,以及我所做的研究,我对头文件的功能和用途以及如何使用它们有了相当好的理解。但是,我越是尝试重新创建在C#中建立的get set原则,我就越是不清楚什么东西应该放在.h还是.cpp中。在熟悉图书馆和如何使用图书馆的问题上,我也很不在行,所以我不知道是否还有其他方法。我在网上找到的Exmaple中,没有一个能接近我的问题,或者回答我的问题,或者在很大程度上过于通用或具体,无法提供帮助

有一个叫做TilePattern的类的第二个问题,它由一个坐标列表组成,但我觉得一旦我解决了这个坐标问题,我就能自己解决这个问题


那么,我是否忽略了一些非常简单的事情?这是新手犯的错误吗?这只是C++中的一个更复杂的问题吗?库中是否有我不知道的工具可以解决所有这些问题?

首先,看起来您正在 标题,然后在cpp中。这是一对多
其次,如果
Coordinate
对更改没有“反应”,那么您需要的是
可能是这样的:

struct Coordinate {
    int x,y;
};
不要过度设计它。它仍然可以像这样使用

return Coordinate{5,7} ;
诸如此类。如果您确实需要getter、setter方法来报告
更改,检查其内部债券等,是的,这是一个更详细的C++,
如果必须具有赋值语法,则通常的方法是:

int X() { return x; }
void X(int xx) { x=xx; report_change(); }

不久前,我在我的网站上发布了一个解决方案:

我建议使用模板类实现get/set属性

这是模板类:

    // Template class for __property construct emulation
template< typename owner_t, typename prop_t, void (owner_t::*setter)(prop_t), prop_t (owner_t::*getter)() >
class CProperty
{
public:
  // Constructor
  CProperty(owner_t* owner){m_owner = owner;}

  // op = overloading
  void operator=(prop_t value)
  {
    return (m_owner->*setter)(value);
  }
  // op type overloading
  operator prop_t()
  {
    return (m_owner->*getter)();
  }
private:
  owner_t* m_owner;
};
//用于_属性构造仿真的模板类
模板
类属性
{
公众:
//建造师
CProperty(owner_t*owner){m_owner=owner;}
//op=过载
void运算符=(属性值)
{
返回值(m_所有者->*设定者)(值);
}
//op型重载
运算符prop_t()
{
返回(m_所有者->*getter)();
}
私人:
业主(t*m)业主;;
};
end这是一个在CPanel类中使用的示例,该类声明了一些属性:

class CPanel
{
private:
  int m_Width;  // Private member for Width property
  int m_Height; // Private member for Height property

protected:
  void __fastcall SetWidth(int AValue); // Set the Width property  
  int __fastcall  GetWidth();           // Get the Width property

  void __fastcall SetHeight(int AValue);// Set the Height property
  int  __fastcall GetHeight();          // Get the Height property

public:
  CPanel()
  :Width(this), Height(this)
  {
  }

  CProperty<CPanel, int, SetWidth,  GetWidth>  Width;
  CProperty<CPanel, int, SetHeight, GetHeight> Height;
}
classcpanel
{
私人:
int m_Width;//Width属性的私有成员
int m_Height;//Height属性的私有成员
受保护的:
void uu fastcall SetWidth(int AValue);//设置Width属性
int uu fastcall GetWidth();//获取Width属性
void uu fastcall SetHeight(int-AValue);//设置Height属性
int uu fastcall GetHeight();//获取Height属性
公众:
CPanel()
:宽度(此)、高度(此)
{
}
属性宽度;
属性高度;
}

如果您需要更多帮助,可以在评论部分询问。

是的,不要过度编译它

我会这样做

//Coordinate.h
class Coordinate
{
private:
   int m_x;
   int m_y;
public:
   Coordinate(const int& x_, const int& y_):m_x(x),m_y(y){}
   Coordinate():m_x(0),m_y(0){}

   const int& x() const;
   void x(const int& x_);

   //For these methods I would do it inline like this.
   const int& y() const {return m_y;}
   void y(const int& y_) {m_y = y_;}
};

//Coordinate.cpp (if used)
const int& Coordinate::x() {return m_x;}
void Coordinate::x(const int& x_) {m_x = x_;}
<>注意,在C++中,GET/SET不多用,C++的获取名称的方式只是说<代码>名称()>代码>。设置名称可能需要一个
set\u名称(const std::string&name)
,但我通常更喜欢最低限度的
void名称(const std::string&name)
当它与getter
name()配对时,它是有意义的

你也可以这样做

class Coordinate
{
...
public:
   int& x(){return m_x;}
...
};
并将其用作

Coordinate c(3,4);
std::cout<<c.x()<<std::endl;
c.x() = 17;
std::cout<<c.x()<<std::endl;

但是,最后一种方法会暴露类的内部实现细节,应该避免使用。

您的构造函数已经在标头中实现,无需在cpp文件中重新定义它。此外,C++没有属性,所以使用预处理器魔术来模拟行为是一个丑陋的黑客。在这种特定情况下,将X和Y作为公共字段/成员变量是完全可以的。重复的构造函数是一个愚蠢的错误。现在我已经从.cpp中删除了它,但是它仍然需要两个int,因为构造函数是如何在.h中定义的。因此,我对如何获取和设置X和Y值作为调用构造函数的.cpp的输入感到困惑。你所说的看起来很有效,但我不确定我是否理解。。。你能再解释一下吗?或者,我可以查找什么名称来为自己找到答案?对于这样一个简单的类型,您实际上不需要构造函数。签出
统一初始化
Coordinate c(3,4);
std::cout<<c.x()<<std::endl;
c.x() = 17;
std::cout<<c.x()<<std::endl;
3
17