C++11 c++;11类初始化错误

C++11 c++;11类初始化错误,c++11,memory,C++11,Memory,为什么BASE*BASE_0=newbase()//错误?定义类时是否分配内存 class BASE { public: int *i = new int(5); BASE *base_0 = new BASE(); static const BASE base_1; static BASE base_2; ~BASE() {

为什么
BASE*BASE_0=newbase()//错误?
定义类时是否分配内存

class BASE {

public:
     int *i = new int(5);                              
     BASE *base_0 = new BASE();      
     static const BASE base_1;       
     static BASE base_2;             
    ~BASE() {
     cout << "~";
    }

};
类基{
公众:
int*i=新的int(5);
BASE*BASE_0=新的BASE();
静态常数基_1;
静基座2;
~BASE(){

cout您缺少构造函数,它正在尝试在创建默认构造函数之前填充新的BASE()。这是您收到的
constepr BASE::BASE()
错误。在类中的任何位置添加
BASE::BASE()
构造函数应该可以解决此问题

对于初始化指针,您可能希望在构造函数中也这样做

class BASE 
{

public:
  BASE()
  {
    std::cout << "c";
    i = new int(5);
    base_0 = new BASE();
  }
  ~BASE()
  {
    std::cout << "~";
  }

  int *i;                              
  BASE *base_0;
  static const BASE base_1;       
  static BASE base_2;                   
};
类基
{
公众:
BASE()
{

std::cout不同的编译器会给您带来不同的错误:

struct S {
    S* s = new S();
};
在GCC的正确版本下产生:

prog.cpp:2:15: error: constructor required before non-static data member for 'S::s' has been parsed
  S* s = new S();
               ^

即使此时您实际上没有调用
new
,编译器也需要解析
new
调用。因为您没有提供默认的ctor,它必须合成一个,但它不能这样做,因为此成员引用引用默认ctor的
new
,所以直到此语句完全支持为止它不知道如何生成ctor

另外,你在对另一个答案的评论中说“我不创建任何基础对象”,但事实上你是这样做的:

 static const BASE base_1;       
 static BASE base_2;             

这两条语句都要求程序在启动时默认初始化一个BASE实例,BASE实例要做的第一件事是分配一个BASE的动态实例并调用它的构造函数,这将…

um什么?创建一个
BASE
不会通过
new
创建另一个
BASE
吗或者永远创建另一个
BASE
和另一个
BASE
吗?这里的用例是什么?您能提供从编译器得到的错误吗?合成方法'constepr BASE::BASE()'这里首先需要|@vu1p3n0x u是正确的。但是我不创建对象,所以我们不关心这个问题。我只是定义了类,它不应该分配内存,为什么它也会出错?如果我覆盖BASE(){},没错。谢谢你的anwser,但是我没有创建任何BASE对象,define不应该分配内存。我只是定义了一个这样的类,编译错误:这里首先需要合成方法'constepr BASE::BASE()',我发现如果我覆盖BASE(){},没有错误,当然如果我使用这个类的对象,你所说的可能会发生,但我只是想知道,为什么我只定义这个,compile也有错误?谢谢!想想这个:“合成方法”是构造函数“constepr BASE::BASE()”。编译器正在查看行
BASE*BASE\u 0=new BASE()
并尝试在合成构造函数之前找到
BASE::BASE()
构造函数。