没有合适的默认构造函数 - Visual Studio

时间:2014-05-06 11:48:44

标签: c++ arrays class pointers default-constructor

#include <iostream>
#include <stdlib.h>
using namespace std;

class Rectangle {
  int width, height;
public:
  Rectangle(int x, int y) : width(x), height(y) {}
  int area(void) { return width * height; }
};

int main() {
  Rectangle obj (3, 4);
  Rectangle * foo, * bar, * baz;
  foo = &obj;
  bar = new Rectangle (5, 6);
  baz = new Rectangle[2] { {2,5}, {3,6} };
  cout << "obj's area: " << obj.area() << '\n';
  cout << "*foo's area: " << foo->area() << '\n';
  cout << "*bar's area: " << bar->area() << '\n';
  cout << "baz[0]'s area:" << baz[0].area() << '\n';
  cout << "baz[1]'s area:" << baz[1].area() << '\n';
  delete bar;
  delete[] baz;
  system("PAUSE");
  return 0;
}

此代码在代码块中执行,但在Visual Studio中,没有适当的默认构造函数。

我尝试在这里寻找类似的东西,但我找不到任何东西。

2 个答案:

答案 0 :(得分:1)

operator newoperator new[]之间存在差异,以及将参数传递给新构建元素的构造函数的方式。

for ex :(从维基百科中获取的略有修改版本)

T *p = new T(42); //New T inited to T(42). (same syntax as constructors)
T *parray = new T[42];  //An array of 42 T, inited with T()
T *cpp11array = new T[3] {1, 2, 3};  //3 Ts, inited to T(1), T(2) and T(3) (C++11 only)

您的Visual Studio 似乎不符合 C ++ 11标准。希望应该有一个选项来启用C ++ 11 std,或者你可能想安装最新的编译器。

作为旁注,您应该更喜欢STL容器(例如:std :: array或std :: vector而不是裸指针数组)。

vector<Rectangle> baz;
baz.push_back( Rectangle(2, 5) );
baz.push_back( Rectangle(3, 6) );

答案 1 :(得分:0)

这是VS2013中的非标准行为,我们可以将其称为在以后版本中修复的错误。

gcc-4.8中也是runs