Преобразование кода C ++ в C, это эквивалентно?

0

Мне пришлось преобразовать программу C++ в C, которая была выполнена. Вопрос в том, эквивалентны ли представленные коды и пропустил ли я что-нибудь.

Оба представленных кода являются полными и должны компилироваться. Оба дают одинаковые ответы при запуске. Но я новичок в C++, и я не знаю, пропустил ли я что-то в своем преобразовании, которое могло бы быть важным.

Еще один вопрос, в коде C++, int x и int y были объявлены глобальными, у меня их нет, и я не думаю, что мне нужно что-то подобное, но я действительно не знаю, что они делают, Руководство?

C++

#include <iostream>

// a point on the integer grid

struct Point
{
  // constructor
  Point()
  {
    x = y = 0;
  }

  // add point componentwise
  void add(const Point &p)
  {
    x += p.x;
    y += p.y;
  }

  // print to standard output
  void print() const
  {
    std::cout << "[" << x << "," << y << "]" << std::endl;
  }

  // data
  int x, y;
};

int main()
{
  const int N = 200;
  Point *A = new Point[N], sum;

  for (int i=0; i < N; ++i) {
    sum.print();
    A[i].x = i; A[i].y = -i;
    sum.add(A[i]);
  }
  sum.print();

  delete [] A;
}

С

#include <stdio.h>
#include <stdlib.h>

typedef struct //constructor
{
     int x;
     int y;
} Point;

void add(const Point * p, Point * sum)
{
    (*sum).x += (*p).x;
    (*sum).y += (*p).y;

}

void print(const int x, const int y)
{
    printf("[%d,%d]\n", x, y);
}

int main()
{
    int i = 0;

    const int N = 200;


   Point *A = malloc(N*sizeof(Point)), sum;
   if(!A)
        {
        printf(stderr, "malloc() failed to allocate memory!");
        abort();
        }

   sum.x =0;
   sum.y = 0;

    for (i = 0; i <N; i++)
    {
    print (sum.x, sum.y);
        A[i].x = i; A[i].y = -i;
     add(&A[i], &sum);
    }
    print(sum.x, sum.y);

    free(A);
return 0;
}
  • 1
    В C ++ вы можете создать класс с именем Point вместо использования struct
  • 0
    Я должен уточнить, что я не писал код на C ++, только код на C.
Показать ещё 15 комментариев
Теги:

2 ответа

0
Лучший ответ

Это справедливо эквивалентно функционально (кроме проблемы с конструктором, см. Ниже). Но по какой-то причине он содержит ряд несоответствий и "нелогичных" стилистических решений.

  • "Стандартный" подход приблизить метод C++ с помощью функции C состоит в том, чтобы реализовать C++ неявный this параметр через явный параметр. Это заставит вашу функцию add выглядеть следующим образом

    void add(Point *this, const Point *p)
    {
      this->x += p->x;
      this->y += p->y;
    }
    

    Обратите внимание, что в версии C++ вы также можете использовать синтаксис this->x с левой стороны (а не просто x), что только подчеркивало бы сходство. Очевидно, моя версия выше такая же, как ваша, но организована в том, что я считаю более "традиционной".

  • Вы забыли определить "конструктор" для вашей версии Point в C. В коде C++ объекты Point начинаются с инициализации до нуля. В C-коде эти объекты начинают свою жизнь с мусора в x и y. Позже вы назначаете окончательные значения x и y, что делает проблему без инициализации непоследовательной, но все же она есть.

    Конечно, если вы решите реализовать функцию "конструктор", вам придется вызывать ее вручную для каждого элемента массива, а в C++ он автоматически вызывается для вас.

  • По какой-то причине вы решили "разобрать" объект в параметры x и y для функции print. Зачем? Опять же, тот же подход с явным this параметром может использоваться для print и он будет выглядеть следующим образом

    void print(const Point *this)
    {
      printf("[%d,%d]\n", this->x, this->y);
    }
    

    В текущей версии

    void print(const int x, const int y)
    

    const классификаторы, применяемые к параметрам не достичь практически ничего полезного и не способствуют эквивалентностям в C++ версии (то есть эти const классификаторы не эквивалентны, что завершающий const в C++ версии).

    Но, в любом случае, это чисто стилистические предложения.

  • Заметим также, что на языке C++

    const int N = 200;
    

    определяет константу, а на языке C она не определяет константу. В C он определяет, что по существу является "немодифицируемой переменной". Но это совершенно не обязательно для вашего кода, так как ваш код не заботится о том, является ли N константой или нет. (Я не знаю, заботитесь ли вы о подобной педантичной эквивалентности.)

  • 0
    Спасибо за комментарии! Я новичок в кодировании и, полагаю, мне удобнее использовать синтаксис, который я использовал, чем - -. Тем не менее, изменил его. Хороший момент на печати
0

Это зависит от уровня "эквивалентности", который вы ищете. В версии C у вас нет функции, эквивалентной конструктору Point, и вы избегаете инициализации по умолчанию в массиве точек, ваша функция печати C работает на int вместо объекта Point, и я вижу некоторые несоответствия const такие как Дело в том, что ваш C add функцию принимает указатель неконстантных Point на правой стороне в то время как C++ версия принимает ссылку на константную Point.

  • 0
    Хорошая точка зрения. Добавлена функция конструктора для инициализации значений Point на 0 после вызова malloc. Я не думал, что это имеет значение, так как я сразу даю значения структур (кроме новых, не инициализируя, что делает вывод неправильным), но это, безусловно, должно быть. Спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню