Я знаю, я мог бы использовать std :: vector или что-то в этом роде, но я хочу знать, где я ошибаюсь. В приведенном ниже примере, только p3 в моих глазах действительно указатель на массив указателей и используется так, как я ожидал. Использование p1 вместо этого выглядит как-то неправильно для меня, потому что похоже, что p1 также является массивом указателей, таких как p2, а не указателем на массив указателей, за исключением операции удаления. Поэтому, когда я пытаюсь использовать p2, как я использую p3:
(*p2)[i] = new Foo(i);
, возникает ошибка:
ambiguous overload for ‘operator=’ (operand types are ‘Foo’ and ‘Foo*’)
Вопрос :
- Почему я должен использовать приведение в строке, где выделен p3?
- Это назначение для p3 правильное или оно просто работает по инциденту?
#include <iostream>
using namespace std;
class Foo
{
public:
Foo (int key)
: key(key)
{}
int show() const
{
return key;
}
private:
int key;
};
int main (int, char**)
{
int aSize = 10;
using FooP = Foo *;
FooP *p1 = new FooP[aSize];
FooP p2[aSize];
FooP (*p3)[] = (FooP (*)[]) new FooP[aSize];
for (int i=0; i < aSize; i++)
{
p1[i] = new Foo(i);
p2[i] = new Foo(i + aSize);
(*p3)[i] = new Foo(i + aSize * 2);
}
for (int i=0; i < aSize; i++)
{
cout << p1[i]->show() << ", "
<< p2[i]->show() << ", "
<< (*p3)[i]->show()
<< endl;
delete p1[i];
delete p2[i];
delete (*p3)[i];
}
cout << endl;
delete [] p1;
delete [] p3;
return 0;
}