Почему мы используем typedef в структуре, когда у нас есть более короткий метод - PullRequest
0 голосов
/ 30 апреля 2018

Когда я определяю некоторую случайную структуру, как, например, в файле cpp в Visual studio

1)    struct CAddition {
    int x, y;

    CAddition(int a, int b) { x = a; y = b; }
    int result() { return x + y; }
};

и теперь, если я определю некоторый объект структуры

CAddition foo;

работает без ошибок но если я использую псевдоним в конце

2) struct CAddition {

    int x, y;

CAddition(int a, int b) { x = a; y = b; }
int result() { return x + y; }
}CAddition;

Я не могу просто определить любой объект, не используя struct перед определением

 struct CAddition foo;

или альтернативный метод - добавить

typedef struct CAddition { 

В методе 2, чтобы избежать переписывания структуры каждый раз, мой вопрос заключается в том, в чем разница между этими двумя определениями, разве метод 1 не использует меньше ключевых слов и намного проще в использовании, при каких условиях мы должны использовать второе определение структуры .

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

работает без ошибок, но если в конце я использую псевдоним

В 2) вы не используете «псевдоним», но вы создаете экземпляр того класса, который вы только что определили (структуры и классы одинаковы в c ++, кстати). Затем у вас есть экземпляр с именем, которое скрывает имя класса, и, как следствие, вам нужно struct CAddtion, чтобы сообщить компилятору, что CAddition относится к классу, а не к созданному вами экземпляру.

0 голосов
/ 30 апреля 2018

С struct CAddition { ... } CAddition; вы делаете две вещи:

  1. Вы определяете структуру CAddition как имя типа. Вот что делает struct CAddition.
  2. Вы определяете переменную CAddition. Переменная равна после структуры.

Поскольку вы определяете переменную CAddition, вы не можете использовать это имя для типа, так как тогда компилятор подумает, что вы имеете в виду переменную, а не структуру. Чтобы решить эту проблему, вам нужно использовать struct CAddition, чтобы явно указать компилятору, что вы имеете в виду имя структуры.


На несвязанной ноте: struct аналогично class, с той разницей, что все члены public по умолчанию в struct. Таким образом, вам не нужна спецификация public в struct.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...