Ошибка при запросе члена класса [duplicate]

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

Например:

var result = 1.0 + 2.0;     // result === 3.0 returns true

... вместо:

var result = 0.1 + 0.2;     // result === 0.3 returns false

Выражение 0.1 + 0.2 === 0.3 возвращает false в JavaScript, но, к счастью, целочисленная арифметика в плавающей запятой является точной, поэтому ошибки с десятичным представлением можно избежать путем масштабирования.

В качестве практического примера, чтобы избежать проблем с плавающей запятой, где точность имеет первостепенное значение, рекомендуется обрабатывать деньги как целое число, представляющее число центов: 2550 центов вместо 25.50 долларов.


1 Дуглас Крокфорд: JavaScript: Хорошие детали: Приложение A - Ужасные части (стр. 105) .

165
задан Jarod42 5 February 2016 в 02:17
поделиться

9 ответов

Самый неприятный синтаксический разбор

Это связано с тем, что известно как «самый неприятный синтаксис C ++». В принципе, все, что может интерпретировать компилятор как объявление функции, будет интерпретироваться как объявление функции.

Другой экземпляр той же проблемы:

std::ifstream ifs("file.txt");
std::vector<T> v(std::istream_iterator<T>(ifs), std::istream_iterator<T>());

v интерпретируется как объявление функции с двумя параметрами.

Обходной путь заключается в добавлении еще одной пары круглых скобок:

std::vector<T> v((std::istream_iterator<T>(ifs)), std::istream_iterator<T>());

Или, если у вас есть C ++ 11 и инициализация списка (также известная как равномерная инициализация):

std::vector<T> v{std::istream_iterator<T>{ifs}, std::istream_iterator<T>{}};

При этом нет возможности интерпретировать его как объявление функции.

138
ответ дан Remy Lebeau 25 August 2018 в 20:44
поделиться

Поскольку он рассматривается как объявление для функции:

int MyFunction(); // clearly a function
MyObject object(); // also a function declaration
84
ответ дан 1800 INFORMATION 25 August 2018 в 20:44
поделиться

Из n4296 [dcl.init]:

[Примечание: поскольку () не разрешено синтаксисом для инициализатора , X a(); не является объявление объекта класса X, но объявление функции не принимает аргумента и возвращает X. Форма () разрешена в некоторых других контекстах инициализации (5.3. 4, 5.2.3, 12.6.2). -End note]

3
ответ дан Andreas DM 25 August 2018 в 20:44
поделиться

Я думаю, компилятор не знал бы, будет ли этот оператор:

MyObject object ();

- это вызов конструктора или прототип функции, объявляющий функцию с именем object с возвращаемым типом MyObject и без параметров.

5
ответ дан Black 25 August 2018 в 20:44
поделиться

Вы также можете использовать более подробный способ построения:

MyObject object1 = MyObject();
MyObject object2 = MyObject(object1);

В C ++ 0x это также позволяет использовать auto:

auto object1 = MyObject();
auto object2 = MyObject(object1);
7
ответ дан dalle 25 August 2018 в 20:44
поделиться

Поскольку компилятор считает, что это объявление функции, которая не принимает аргументов и возвращает экземпляр MyObject.

10
ответ дан Fred Larson 25 August 2018 в 20:44
поделиться

Как говорили другие, это объявление функции. Начиная с C ++ 11 вы можете использовать инициализацию скобки, если вам нужно увидеть пустое something , которое явно сообщает вам, что используется конструктор по умолчанию.

Jedi luke{}; //default constructor
1
ответ дан Hitokage 25 August 2018 в 20:44
поделиться

Как уже упоминалось много раз, это декларация. Это способ обратной совместимости. Одна из многих областей C ++, которая является тупой / непоследовательной / болезненной / фиктивной из-за ее наследия.

5
ответ дан Michael Burr 25 August 2018 в 20:44
поделиться

Тот же синтаксис используется для объявления функции - например, функция object, не принимая параметров и возвращая MyObject

50
ответ дан Nemanja Trifunovic 25 August 2018 в 20:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: