科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件下一代C++:C++/CLI语言的属性探索

下一代C++:C++/CLI语言的属性探索

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文的目的是在探讨C++/CLI语言在这一领域的发展方向

作者:刘涛 来源:天极开发 2007年11月16日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
三、属性变量

  除了上述代码中声明的简单的分层属性,C++/CLI还引进了其他几种类型属性变量。

  (一)静态分层属性

  静态分层属性使用关键字"Static"来声明,它们的存取操作函数是静态的,静态属性的存取操作与静态数据成员的存取操作非常一致。(例如:使用C::P语法来获取C类的静态属性P)

  (二)不明显的分层属性

  一个属性的定义(即括号内的存取操作函数声明)可以使用分号";"来代替,在这种情况下,get和set存取函数综合成一个简单的可以存取操作的属性值。例如,C++/CLI定义的一个类如下:

struct TrivialProp {
 property int Val;
};

  上述代码从本质上与下述代码相同:

struct TrivialProp {
 property int Val {
  int get() const { return this->__Val; }
  void set(int v) { this->__Val = v; }
 }
 private:
  int __Val;
};

  (三)指定索引属性

  使用操作数组成员的老语法,指定索引可以操作一个数值集合,下面的例子显示了一维索引属性的操作。

struct Demo2 {
 property int x[std::string] {
  int get(std::string s) const { ... }
  void set(int v, std::string s) { ... }
 }
 // ...
};
int main() {
 Demo2 d;
 std::string s("CLI");
 d.x[s] = 3; // Calls Demo2::x::set(3, s)
 return d.x[s]; // Calls Demo2::x::get(s)
}

  注意,指定索引的属性不能是静态变量。

  多维的索引属性也是可以的,它引入的操作语法与C/C++中数组元素操作方法不太一样,例如:

struct Demo3 {
 property double x[std::string, int] {
  double get(std::string s, int n) const { ... }
  void set(double v, std::string s, int n) { ... }
 }
 // ...
};
int main() {
 Demo3 d;
 std::string s("CLI");
 d.x[s, 7] = 42.0; // Calls Demo3::x::set(42.0, s, 7)
 return d.x[s, 7] != 42.0; // Calls Demo3::x::get(s, 7)
}

  后面的这一个例子说明了出现在括号内的操作索引属性的逗号符号是表达式操作符号,而不是一个逗号操作符。(下面将讨论这种规则带来的后果)。

  (四)默认的索引属性

  除了对象被编入伪域外,默认的索引属性与指定的索引属性非常相象,对象本身可以索引(仿佛它自身有一个[]操作成员函数一样),以前的代码只要稍微改动一下就可以说明这种变化。

struct Demo4 {
 property double default[std::string, int] {
  double get(std::string s, int n) const { ... }
  void set(double v, std::string s, int n) { ... }
 }
 // ...
};
int main() {
 Demo4 d;
 std::string s("CLI");
 d[s, 7] = 42.0; // Calls Demo4::default::set(42.0, s, 7)
 return d[s, 7] != 42.0; // Calls Demo4::default::get(s, 7)
}

  请关注关键词"default"代替属性名的用法。

  四、一些技术性问题

  欧洲计算机制造商协会(C++/CLI标准的制订者)已经研究并解决了引入属性所带来的若干问题,下面这些内容尤其值得关注。

  (一)多维索引属性的操作

  p->x[2, 3]表达式拥有不同的意思,这要视成员x是否是属性(这种情况下逗号分隔两个索引属性)或其它成员变量(这种情况下逗号是个操作符号,表达式的意思等同于p->x[3])而定。为了在一个属性索引中获取逗号操作符的效果,开发人员可以使用圆括号(即p->x[(2, 3)])。

  (注意,在依赖模版的表达式中,这将产生模糊性,并且直到实例化时问题才能得到解决)

  (二)属性名与类型名冲突

  微软.NET框架带有很多包含属性的类(这些类最初并不是使用C++/CLI来开发的),这些包含的属性名与属性类型的名字相同,例如:

typedef int Color;
struct Conflict {
 property Color Color { // Property name hides type name
  typename Color get() const;
  void set(typename Color);
 }
 // ...
};
}

  为了帮助在这种上下文中书写代码,C++/CLI计划添加语法,使用关键词typename来标识不标准的类型(特别是"属性"),查找标志符的过程中将被忽视。上述的代码就以这种新的形式使用typename关键词。

  (三)重载的索引属性

  索引属性可以被重载,即,几个指定索引属性可以使用同一个名字共存于同一个类中,假定它们可以根据属性的类型来区分开来。相似地,默认的索引属性可以使用其他属性或操作符[]来重载。解决两意性与重载行为的规则已经被建立起来,来处理上述情况。

  (四)保留的成员名字

  C++/CLI属性通过综合特定的成员来实现,这些成员的名义由微软的.NET框架来规定,并且必须得到保留。

  如果一个类包含分层的属性或指定索引属性X,成员名 get_X 和set_X在类中得到保留(即使属性仅仅包含一个操作函数也是这样)。相似地,如果一个类包含有一个默认的索引属性,类中的成员函数get_Item 和set_Item也将得到保留。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章