Как инициализировать объект в указатель внутри объекта без динамического выделения (то есть NEW) в C ++? - PullRequest
0 голосов
/ 16 января 2012

Например:

class A{

int b;
A *a1;
A *a2;

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

}

Я думал, что это путь, но он не компилируется.Есть ли способ сделать это, или это всегда необходимо использовать динамическое распределение?спасибо

Ответы [ 3 ]

1 голос
/ 16 января 2012

Если вы не хотите инициализировать указатели на nullptr (NULL или 0 pre-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 с, и этот цикл будет продолжаться, пока вы не исчерпаетепамять.

1 голос
/ 16 января 2012

Непонятно, что вы пытаетесь сделать, но вы, безусловно, можете это сделать:

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
}

Просто будьте осторожны.Если m1 или m2 выйдут из области видимости до m3, тогда в m3 останутся указатели, указывающие на случайный мусор.

1 голос
/ 16 января 2012

Вы можете просто инициализировать указатели на нуль.

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)  {}

}
...