С++, класс как параметр метода, а не шаблон
Итак, я наткнулся на интересную сигнатуру метода, которую я не совсем понимаю, она пошла по строкам:
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++)
объявление класса - это определение и указатель на него