作为序言,我正在重建旧游戏项目的基础。它是用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 ++中是否更复杂?库中是否有一个我不知道的工具可以修复所有这些?
答案 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
然而,最后这种做法暴露了你班级的内部实施细节,应该避免。