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

时间:2014-07-22 20:11:51

标签: c# c++ class constructor header

作为序言,我正在重建旧游戏项目的基础。它是用C#编写的,我正在尽我所能将我所拥有的内容转换为C ++。我也在使用Visual Studio Professional 2013.在这个例子中,我有一个Coordinate类,可以动态获取和设置X和Y属性的值。总而言之,这是相当直接的。

这是C#类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConquestGameEngine.Map
{

    public class Coordinate
    {
        public int X { get; set; }
        public int Y { get; set; }
        public Coordinate(int x, int y)
        {
            this.X = x;
            this.Y = y;
        }
    }
}

这是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中。当谈到熟悉图书馆以及如何使用图书馆时,我也很认真,所以我不知道是否还有其他方法可以解决这个问题。我在网上找到的这些例子都没有接近我的问题,或回答我的问题,或者过于笼统或特定的帮助。

有一个名为TilePattern的类的次要问题是由一个坐标列表组成,但我觉得一旦找到这个坐标问题,我就可以自己解决这个问题。

所以我忽略了一些非常简单的事情?这是新手的错误吗?这在C ++中是否更复杂?库中是否有一个我不知道的工具可以修复所有这些?

3 个答案:

答案 0 :(得分:0)

首先,看起来你正在定义构造函数 标题,然后在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(); }

答案 1 :(得分:0)

我前段时间在我的网站上发布了一个解决方案:http://www.cbuilderblog.com/una-classe-template-alternativa-a-__property/

我提出了使用模板类实现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;
};

结束这是一个在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;
}

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

答案 2 :(得分:0)

好吧,不要过度编译

我会做这样的事情

//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 ++获取名称的方式只是说name()。设置一个名称可能需要set_name(const std::string& name),但我通常更喜欢简约void name(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;

将打印

3
17

然而,最后这种做法暴露了你班级的内部实施细节,应该避免。