LINUX.ORG.RU

С++. два вопроса =)


0

0

Нашел два непонятных места в исходниках SUperTux :)

вот:

1:

[code]
void
BadGuy::set_sprite(Sprite* left, Sprite* right) 
{
  if (1)
    {
      base.width = 32;
      base.height = 32;
    }
  else
    {
      // FIXME: Using the image size for the physics and collision is
      // a bad idea, since images should always overlap there physical
      // representation
      if(left != 0) {
        if(base.width == 0 && base.height == 0) {
          base.width  = left->get_width();
          base.height = left->get_height();
        } else if(base.width != left->get_width() || base.height != left->get_height()) {
          base.x -= (left->get_width() - base.width) / 2;
          base.y -= left->get_height() - base.height;
          base.width = left->get_width();
          base.height = left->get_height();
          old_base = base;
        }
      } else {
        base.width = base.height = 0;
      }
    }

  animation_offset = 0;
  sprite_left  = left;
  sprite_right = right;
}
[/code]

как понять if(1)? Это ведь всегда будет возвращать истину.


2:

[code]
Physic::Physic()
    : ax(0), ay(0), vx(0), vy(0), gravity_enabled(true)
{
}
[/code]

что за : ax(0), ay(0), vx(0), vy(0), gravity_enabled(true) ??? еще никогда такого не видел. огомное спасибо за ответы за ранее :)
anonymous

> что за : ax(0), ay(0), vx(0), vy(0), gravity_enabled(true)

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

SSZB
()

> как понять if(1)? Это ведь всегда будет возвращать истину.

Это типа костыль. То есть, разработчик когда-нибудь в будущем думает попробовать значение 0 в этом месте. В классическом C для этих целей использовалось #ifdef TRUE.

eugine_kosenko ★★★
()
Ответ на: комментарий от SSZB

И конструкторы родительских классов там же указываются. ЕМНИП только там.

Begemoth ★★★★★
()

Книжки читать будем, да?

)

anonymous
()
Ответ на: комментарий от eugine_kosenko

> Это типа костыль.

Это типа комментарий.  Он имеет преимущество над /* */ комментарием
-- в такой комментарий можно вложить /* */ комментарий:

if(0)
{
  code ...
  /* comment */
  more code ...
}

а так нельзя:

/*
  code ...
  /* comment */
  more code ...
*/

> В классическом C для этих целей использовалось #ifdef TRUE.

В Си используется #if 0.  Согласно стандарту в Си нет TRUE, а
согласно логике его и не может быть (ибо тру это всё что угодно кроме
нуля).

anonymous
()
Ответ на: комментарий от anonymous

Да, будем читать O:-)

И еще один ламерский вопросик по С++...

иноглда вижу

char* temp;

иногда char *temp;

я на С всегда использовал второй вариант. а в С++ оба используются. Есть хоть какие-то различия?

anonymous
()
Ответ на: комментарий от anonymous

> Есть хоть какие-то различия?

нет, но ibm рекомендует второй вариант :)

true_admin ★★★★★
()
Ответ на: комментарий от anonymous

Если не ошибаюсь то
char* temp, temp1, temp2; 
Все переменные будут (char*)
А 
char *temp, temp1, temp2
temp указатель, а остальные просто char 

I3rain
()
Ответ на: комментарий от I3rain

Почему то мне кажется, что ошибаешься.

anonymous
()

>>что за : ax(0), ay(0), vx(0), vy(0), gravity_enabled(true) ??? еще никогда такого не видел. огомное спасибо за ответы за ранее :)

google => c++ initialization list

ax(0) можно кстати сократить до ax(), в С++ есть встроенные конструкторы :)

alex_custov ★★★★★
()
Ответ на: комментарий от alex_custov

>ax(0) можно кстати сократить до ax(), в С++ есть встроенные конструкторы :)

Можно. Но снижать читаемость за счет экономии 1 символа ИМХО не имеет смысла

Sectoid ★★★★★
()
Ответ на: комментарий от Legioner

>Чисто теоретически () более универсален чем (0), т.к. может измениться тип у переменной и т.д.

Конкретно в данном случае ax имеет семантику числа, по-этому замена типа ax на какой-то тип, не имеющий конструктора "из числа" породит ошибку компиляции.

Sectoid ★★★★★
()
Ответ на: комментарий от I3rain

>Если не ошибаюсь то
>char* temp, temp1, temp2; 
>Все переменные будут (char*).....

int main(void)
{
    char * temp1, temp2;
    char* temp3, temp4;
    char *temp5, temp6;
    char *temp7, *temp8;
    printf("%i %i\n%i %i\n%i %i\n%i %i\n", sizeof(temp1), sizeof(temp2),
                                           sizeof(temp3), sizeof(temp4),
                                           sizeof(temp5), sizeof(temp6),
                                           sizeof(temp7), sizeof(temp8));
    return 0;
}

результат:
4 1
4 1
4 1
4 4

чтд

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.