铸造后未初始化变量

时间:2014-03-16 23:03:36

标签: c++ c++11

我试图上课,但有些事情是错的。我正在尝试static_cast<>dynamic_cast<>,但仍然遇到错误。我需要一个包含2种类的数组。

class user
{
  int value;
  user(int valueInit) 
  {
     value = valueInit;
  };

  int getValue()
  {
     return value;
  }

};

class premium : public user
{
  int premiumValue;
  premium(int valueInt, int premiumValueInit) 
  {
      value = valueInt;
      premiumValue = premiumValueInit;
  };
};

这是main()函数

中的主要代码
user fUser(10);
premium fPremium(20, 5);

premium *array = new premium[2];

(user)array[0] = u1;
array[1] = p1;

cout << "Value: " << array[0].getValue() << endl; //incorrect/random value
    cout << "Value: " << array[1].getValue() << endl; //correct value

通常我使用java,所以我的c ++存在很大问题。我知道我应该做什么,但我不知道如何。

1 个答案:

答案 0 :(得分:1)

原因

您的演员阵容(user)array[0] = u1的问题在于它在理论上等同于以下代码:

{
  user unnamed_instance = array[0];
       unnamed_instance = u1;
}

(T)a = b;中,将创建一个未命名的临时文件,其类型为T,而其初始化值为b。您要分配给此未命名的临时,而不是a

注意:在这种情况下slicing发生,即。 array[0]中具有premium类型的值将被切分为user。功能


解决方案

如果您希望将array[0]中的值视为user类型而不引入临时值,则需要使用指针或引用。以下内容会正确地将u1分配给array[0],就像array[0]类型为user一样。

// using a reference 

static_cast<user&> (array[0]) = u1;

// using a pointer

user * ptr = static_cast<user*> (&array[0]);
      *ptr = u1;