【问题标题】:Error when initializing heap-allocated object初始化堆分配对象时出错
【发布时间】:2011-12-27 12:49:17
【问题描述】:

我正在尝试如下初始化一个堆分配的对象:

class Ball {
  int radius;
  string colour;
};

int main(){
    Ball *b = new Ball { radius = 5, colour = "red" };
}

想知道为什么这会给我一个错误? 谢谢

【问题讨论】:

标签: c++ object initialization


【解决方案1】:

这不是在 C++ 中初始化对象的方式。

这是一种方法:

class Ball {
    int radius;
    string colour;

public:

    //  Define a Constructor
    Ball(int _radius, const string &_colour)
        : radius(_radius)
        , colour(_colour)
    {
    }
};

int main(){
    Ball *b = new Ball(5, "red");

    delete b;  //  Don't forget to free it.
}

【讨论】:

  • 为什么是_s?没有它们就没有歧义。
  • 可能更像是“读者”的歧义。但你是对的,它确实可以在没有_ 的情况下工作。我的印象是参数会影响字段,但我猜它不适用于初始化列表。
【解决方案2】:

很多问题!

试试这个:

class Ball {
public:
  Ball(int r, const string &s)
  {
    radius = r;
    colour = s;
  }
  int radius;
  string colour;
};

int main(){
    Ball *b = new Ball(5, "red");
    // ....
    // delete b;  <-- dont forget
}

【讨论】:

  • @Pubby:c++ 标记的问题,而不是 c++11
  • 我说的是在构造函数中。 Ball(int r, const string &amp;s) : radius(r), colour(s) {}
  • 嗯,是的,我们也可以使用这种风格。
  • @MasoudM。你知道,这不仅仅是一种风格。
【解决方案3】:

使用() 代替{}。您正在调用构造函数,它只是一个实例化对象的特殊函数。

所以,语法看起来像这样:

Ball* b = new Ball(5, "red");

还请注意,构造函数中的参数顺序(“红色”之前的 5 个)指示将哪个变量分配给哪个值。所以,你不要把变量名放在构造函数调用中。

【讨论】:

    【解决方案4】:

    创建对象时使用( ... ) 代替{ ... },无需写变量名。只需传递要分配的值。

    Ball *b = new Ball { radius = 5, colour = "red" };` // Wrong
    

    改成

    Ball *b = new Ball ( 5, "red" );
    

    并且,不要忘记在 Ball 类的 public 部分中声明 a constructor

    Ball(int, std::string);
    

    【讨论】:

      【解决方案5】:

      这适用于 C++11:

      struct Ball {
        int radius;
        std::string colour;
      };
      
      int main() {
        Ball* b = new Ball({ 5, "red" });
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-17
        • 1970-01-01
        • 2020-01-03
        • 1970-01-01
        • 2020-07-25
        • 1970-01-01
        • 2010-09-14
        • 1970-01-01
        相关资源
        最近更新 更多