2.5. Включение встраиваемого файла
Имеется несколько функций-членов или самостоятельных функций, которые требуется сделать встраиваемыми (inline), но вы не хотите определять их все в определении класса (или даже после него) в заголовочном файле. Это позволит хранить объявление и реализацию по отдельности.
Создайте файл #include
включите его в конец своего заголовочного файла. Это эквивалентно помещению определения функции в конец заголовочного файла, но позволяет хранить объявление и определение раздельно. Пример 2.6 показывает, как это делается.
// Value.h
#ifndef VALUE_H__
#define VALUE_H__
#include <string>
class Value {
public:
Value (const std::string& val) : val_(val) {}
std::string getVal() const;
private:
std::string val_;
};
#include 'Value.inl'
#endif VALUE_H__
// Value.inl
inline std::string Value::getVal() const {
return(val_);
}
Это решение не требует пояснений, #include
заменяется на содержимое ее аргумента, так что здесь в заголовочный файл включается содержимое
Глава 3
Числа
3.0. Введение
Даже если вы не занимаетесь написанием научных или инженерных приложений, вам все равно придется работать с числами. Эта глава содержит решения проблем, часто возникающих при работе с числовыми типами С++.
Некоторые из рецептов содержат методики преобразования из числовых типов в тип string
и обратно чисел, представленных в различных форматах (шестнадцатеричном, с плавающей точкой или экспоненциальном). Самостоятельное написание кода для таких преобразований утомительно и требует времени, так что я показываю возможности стандартной библиотеки или одной из библиотек Boost, облегчающие выполнение этих задач. Также имеется несколько рецептов по работе исключительно с числовыми типами: безопасное преобразование между ними, сравнение чисел с плавающей точкой с граничными значениями и поиск минимального и максимального значений.
Рецепты в этой главе предоставляют решения некоторых общих проблем, с которыми обычно сталкиваются при работе с числами в С++, но они не пытаются решать проблем, специфичных для конкретных приложений. При написании научного или инженерного приложения вам также следует взглянуть на главу 11, которая содержит рецепты ко многим общим научным и инженерным алгоритмам.
3.1. Преобразование строки в числовой тип
Имеются числа в строковом формате, и вам требуется преобразовать их в числовой тип, такой как int
или float
.
Это можно сделать двумя способами — с помощью функций стандартной библиотеки или с помощью класса lexical_cast
из Boost (написанного Кевлином Хенни (Kevlin Henney) Функции стандартной библиотеки неуклюжи и небезопасны, но они стандартны, и в некоторых случаях потребуются именно они, так что в первом решении я представлю именно их. lexical_cast
более безопасен, проще в использовании и интереснее, так что я представляю его в обсуждении.
Функции strtol
, strtod
и strtoul
, определенные в <cstdlib>
, преобразуют символьные строки, ограниченные нулем, в long int
, double
или unsigned long
. Они могут использоваться для преобразования чисел, представленных в виде строк с любым основанием, в числовые типы. Код примера 3.1 демонстрирует функцию hex2int
, которая предназначена для преобразования шестнадцатиричной строки в long
.
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
long hex2int(const string& hexStr) {
char *offset;
if (hexStr.length( ) > 2) {
if (hexStr[0] == '0' && hexStr[1] == 'x') {
return strtol(hexStr.c_str(), &offset, 0);
}
}