首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

,c++的有关问题

2012-03-22 
求助,c++的问题typedef double moneyclass account{public:money balance(){return bal}private:typedef

求助,c++的问题
typedef double money;
class account
{
  public:
  money balance()
  {
  return bal;
  }

  private:
  typedef long double money;//error:cannot change meaning of money……1
  money bal;
};

这是 c++primer P383 的一段程序示例,书中说1处的语句是错的,但在紧接着的 P385 又有类似的代码,书上却未说明是错的,精通c的高手帮我解疑迷惑,感激不尽啊!下面是被认为没有错的代码:

typedef string type;
type initval();

class exercise
{
  public:
  typedef double type;//这种情况到底是有错,还是没错?
  type setval(type);
  type initval();

  private:
  int val;
};




在c++primer p382页最下面有这样一句话,“一旦一个名字被用作类型名,该名字就不能被重复定义”,我怀疑这句话是不正确的,请问下,这句话是否正确?







[解决办法]
typedef double money;第一行,已经定义money了,后面就不能再次定义了
[解决办法]
问题的关键是你第二次定义某个名字之前,这个名字有没有用过。
1、代码1之所以错误,是因为第二次定义typedef long double money;/前已经使用了money。如果这样可以的话,就会出现下面的情况:
第二次定义后面的money肯定会服从第二次的定义,也就是long double,而前面balance()的返回值肯定是服从第一次定义,也就是double。你可以想象一下,在同一个类的作用域中,money有两个不同的定义,这样显然是不合理的,当然是不对的。
2、而对于代码2,因为在第一次定义后和第二次定义前,这个名字Type没用被使用过,所以在类的作用域中,第一次的定义会被第二次定义覆盖掉,也就不会出现一个名字两种定义的情况,所以是没有问题的。
不知道这么解释可不可以啊?
[解决办法]

探讨
typedef double money;
class account
{
public:
money balance()
{
return bal;
}

private:
typedef long double money;//error:cannot change meaning of money……1
money bal;
};

……

[解决办法]
C++ primier中是这样说的。名字必须要在使用之前进行定义。而且,一旦一个名字被用作类型名,给名字就不能被重复定义。
[解决办法]
探讨
引用:
typedef double money;第一行,已经定义money了,后面就不能再次定义了


为什么第二段代码,书上没指出是错的,而且编译也通过了

热点排行