Есть несколько хороших решений вашей проблемы. Решения, предлагаемые в качестве ответов, пока не относятся к числу хороших решений (в частности, динамическое размещение, копирование и использование времени жизни временных объектов - это просто очень плохо & trade;). Я просто дам вам одно общее решение.
Простой способ предоставить огромную константу - использовать синглтон Мейерса , что означает определение константы как локальной переменной static
в функции, которая возвращает ссылку на нее:
inline BigThing const& theBigThing()
{
static BigThing const theInstance; // Default constructor does the init job.
return theInstance;
}
Это еще не полное решение, но давайте сначала посмотрим, как можно избавиться от необходимости вызывать функцию и вместо этого иметь дело непосредственно с тем, что выглядит как постоянная:
namespace detail {
inline BigThing const& theBigThing()
{
static BigThing const theInstance; // Default constructor does the init job.
return theInstance;
}
}
BigThing const& theBigThing = detail::theBigThing(); // No copying, just ref.
В вашем случае, когда BigThing
- это массив, который должен быть инициализирован из данных в файле, вы не можете напрямую полагаться на конструктор по умолчанию. Вы могли бы, если бы вы определили класс-оболочку, и это один из способов. Хорошо, давайте сделаем это (это то, что я бы выбрал, я думаю):
namespace detail {
struct BigThingWrapper
{
BigThing thingy_;
BigThingWrapper()
{
// Initialize the thingy_ member here.
}
};
inline BigThing const& theBigThing()
{
static BigThingWrapper const theInstance;
return theInstance.thingy_;
}
}
BigThing const& theBigThing = detail::theBigThing(); // No copying, just ref.
Примечание 1. Я использовал inline
, чтобы код мог быть помещен в заголовочный файл. Просто удалите для реализации, помещенный в файл реализации.
Примечание 2. Этот код не затрагивается руками компилятора и может содержать ошибки, TYPPOS и еще много чего. :-) Но эта идея - ваш ответ.
Примечание 3: Как уже упоминалось, есть и другие хорошие способы сделать это, так что это не "ответ", и нет ответа "ответ", но это "ответ".
Приветствия и hth.,