在C++中,如何在没有动态分配(即NEW)的情况下将对象初始化为对象内部的指针

How to initialize an object to a pointer inside an object without dynamic allocation(ie NEW) in C++?

本文关键字:对象 内部 指针 情况下 初始化 NEW C++ 动态分配      更新时间:2023-10-16

例如:

class A{
int b;
A *a1;
A *a2;
A(int c):b(c), a1(c), a2(c)  {}
}

我以为是这样的,但它没有编译。有没有办法做到这一点,或者有必要始终使用动态分配?感谢

您可以简单地将指针初始化为null。

class A{
   int b;
   A *a1;
   A *a2;
   A(int c):b(c), a1(NULL), a2(NULL)  {}
}

(注意,如果它抱怨没有定义NULL,#include <cstddef>)

或者根本不初始化它们。

class A{
   int b;
   A *a1;
   A *a2;
   A(int c):b(c)  {}
}

不清楚你想做什么,但你肯定能做到:

class A{
int b;
A *a1;
A *a2;
A(int c, A* pa1, A* pa2):b(c), a1(pa1), a2(pa2)  {}
}

你可以这样称呼它:

A m1(1, NULL, NULL);
A m2(2, NULL, NULL);
if(something())
{
  A m3(3, &m1, &m2);
  // do stuff with m3
}

只要小心。如果m1m2m3之前超出范围,则m3将留下指向随机垃圾的指针。

如果您不想像这样初始化指向nullptrNULL0在C++11之前)的指针:

class A {
    A(int c) : b(c), a1(), b1() { }
    int b;
    A* a1, *a2;
};

那么,要么使指针指向的对象必须存在于某个外部范围中,以便它至少与包含指针的对象一样长,要么必须使用new

您可以接受A*将指针设置为:

class A {
    A(int c, A* aptr) : b(c), a1(aptr), a2(aptr) { }
    ... 
};

(你不能使用引用,因为这会使A成为A的要求,这是一个不可能满足的条件。不过,你可以制作一个接受引用的额外构造函数。)

在您的示例中,您试图使用int初始化一个指针,但该指针不起作用。此外,如果您在示例中创建一个对象(通过new或其他方式),您将耗尽内存,因为您分配的每个A将再分配两个A,并且该循环将持续到内存耗尽。