С++, класс как параметр метода, а не шаблон

Итак, я наткнулся на интересную сигнатуру метода, которую я не совсем понимаю, она пошла по строкам:

void Initialize(std::vector< std::string > & param1, class SomeClassName * p);

то, что я не понимаю, является ключевым словом "class", используемым в качестве параметра, почему он существует? Нужно ли указывать или чисто поверхностно?

Ответы

Ответ 1

Это форвардное объявление класса. Это фактически то же самое, что

class SomeClassName;
void Initialize(std::vector< std::string > & param1, SomeClassName * p);

Существует много ситуаций, в которых полезно использовать декларацию вперед; есть целый список вещей, которые вы можете и не можете сделать с помощью прямого объявления в этом ответе на другой вопрос).

Ответ 2

Это не поверхностно. Он позволяет вам указать "SomeClassName" в качестве параметра, даже если "SomeClassName" еще не определено.

Ответ 3

Большинство поверхностных. В C, когда вы определяете структуру:

struct x { 
    int member;
    char member2;
};

Чтобы использовать это, вы должны использовать struct x whatever. Если вы хотите использовать x как имя самостоятельно (без struct, предшествующего ему), вы должны использовать typedef:

typedef struct x { 
    int member;
    char member2;
} x;

В С++, однако, первый (без typedef) имеет примерно тот же эффект, что и второй (оба определяют x, поэтому вы можете использовать его отдельно, без struct, предшествующего ему). В С++ a class по существу совпадает с struct, за исключением того, что по умолчанию используется private вместо public (для обоих членов и для наследования).

Единственное место, где есть разница, - это отсутствие определения class в области видимости в точке объявления функции.

Ответ 4

это то же самое, что вы пишете:

for(int i=0;i<10;i++) 

как

int i; 
for(i=0;i<10;i++)

объявление класса - это определение и указатель на него