Назначить массив, который может разрешить NULL членов, без использования кучи? - PullRequest
0 голосов
/ 13 декабря 2011

Существуют ли простые, эффективные ответы на этот вопрос? ... кроме "Решите, что важнее", то есть.

Позвольте мне уточнить. Я хочу фиксированный размер массива. Он представляет собой временные интервалы, которые могут быть открыты для сервера сокетов для приема клиентов. Их ограничено (в настоящее время четыре).

Возможно, с точки зрения C ++ мой вопрос совершенно неверен. Возможно, мне следует рассматривать их как сеансовые интервалы, которые, хотя и заполнены объектами сеанса, не обязательно могут быть использованы до тех пор, пока данный сеанс не будет иметь ссылку на подключенный сокет TCP. Это отличается от большинства динамических языков, где я мог бы просто указывать временные интервалы сеанса как нулевые, пока сеанс не заполнит этот интервал в массиве.

Ответы [ 3 ]

12 голосов
/ 13 декабря 2011

Если вы хотите, чтобы объект с автоматическим хранением имел необязательную семантику (то есть может существовать или не существовать), вы можете использовать boost::optional.

boost::optional<T> - это контейнер, который может иметь ноль или один элемент. Если он пустой, он не хранит объект T, так же как пустой вектор не хранит никаких объектов. Фактически, вы можете думать о boost::optional<T> как о std::vector<T>, чья емкость всегда равна 1 и не может расти. А поскольку требуемый для этого размер хранилища фиксирован и известен во время компиляции (sizeof(T)), boost::optional не требует динамического выделения.

1 голос
/ 13 декабря 2011

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

Пример:

void func()
{
    MyObject obj;
    MyObject* p = 0;

    if(some_condition)
        p = &obj;

    ...
}
0 голосов
/ 13 декабря 2011

размышляя над ответом tenfour , этот код будет работать, и на самом деле это обычное явление:

bool function(int parameter, TYPE& return_val) {
    if (parameter > 7) {
        return_val = 7;
        return true;
    }
    return false;
}

Это не указатель, а просто. передать возврат по ссылке, а если вы присвоили ему значение, вернуть true. В противном случае верните false.

...