Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 班级成员-外部世界为常量,班级为非常量_C++_Oop_Class_C++11_Encapsulation - Fatal编程技术网

C++ 班级成员-外部世界为常量,班级为非常量

C++ 班级成员-外部世界为常量,班级为非常量,c++,oop,class,c++11,encapsulation,C++,Oop,Class,C++11,Encapsulation,例如,我有一个map类,它有一些成员:sizeX,sizeY,tiles向量,name等等 有两种从外部访问变量的基本管理方法: 封装,但它添加了大量代码和更多类型(setX()和getX()const函数) 将经常从外部访问的变量作为公共成员,并使其保持简单 这两个我都不喜欢。我想出了一个主意:一个类成员,它从外部充当常量(因此你可以很容易地访问它object.member,但它是安全的),而在类内部它是非常量的。然而,据我所知,C++缺少它。我所知道的唯一(丑陋的)解决方法是在类函数中使

例如,我有一个map类,它有一些成员:sizeX,sizeY,tiles向量,name等等

有两种从外部访问变量的基本管理方法:

  • 封装,但它添加了大量代码和更多类型(setX()和getX()const函数)
  • 将经常从外部访问的变量作为公共成员,并使其保持简单
这两个我都不喜欢。我想出了一个主意:一个类成员,它从外部充当常量(因此你可以很容易地访问它object.member,但它是安全的),而在类内部它是非常量的。然而,据我所知,C++缺少它。我所知道的唯一(丑陋的)解决方法是在类函数中使用const和const cast


在C++ 11中有更好的方法吗?有关键字吗?

一个简单的解决方法,只需稍微减少键入的数量:

#define MEMBER(T,x) \
  private: T x##_; \
  public: T const& x () const { return x##_; }

struct A {
  MEMBER(int,x)
  MEMBER(double,y)
};

然后您可以在类内使用x_uu和y_u,在类外使用x()和y()。

不回答您的问题,但如果您有一个私有成员x_u和一个公共成员函数x(),则只需为外部用户键入两个额外字符,为类中的内部使用键入一个字符(加上x()的一行定义)。储蓄越少,改变事情就越难。不过听起来可能很方便。对于私有成员来说,Public
const&
应该可以,但这不会节省你太多的打字时间(而且看起来很奇怪)。@Marc Glisse这是另一个想法(只是简单地说一下打字),但是50个变量意味着50个函数,开发速度不是那么快。然而,我认为这似乎是一个解决方案。如果你对50个函数这样做,我只需要写一个宏来帮助你,然后我就可以写:
MEMBER(int,x)
。听起来你好像遇到了称为属性的概念;其中,类可用于允许公共非修改访问,但允许内部私有修改。C++不支持本地,但有几种方法来模拟这个功能。当确实需要从外部进行更改时,我还会将setX(T)函数添加到宏中,但这将被明确地完成。