Глобальная динамическая распределенная структура в C ++

StackOverflow https://stackoverflow.com/questions/9350609

Вопрос

У меня проблемы, пытаясь использовать множество структур, которые не имеют начального размера. Как мне это сделать? Это моя структура:

struct carbon {
    double temp;
    double mass;
    rowvec::fixed<3> position;      
    rowvec::fixed<3> velocity;
    rowvec::fixed<3> force;
} *atom;

Во время моей программы я выделяю размер массива структуры, как это:

  atom = new carbon[PARTICLE_NUM];

Проблема в том, как я затем использую эту структуру в других файлах. Я создал файл заголовка и вложил в него в нем

extern struct carbon *atom;

Но это приходит с этой ошибкой:

setup_pos.cpp:19: error: invalid use of incomplete type ‘struct carbon’
system_setup_distances.h:18: error: forward declaration of ‘struct carbon’

Я знаю, что не должен использовать глобальные переменные, но я просто хочу сначала проверить это. Заранее спасибо за помощь.

Это было полезно?

Решение

Исходный файл, в котором вы используете atom нуждается в полном определении carbon структура.

Соберите структуру вместе с внешним в одном и том же файле заголовка, например,:

struct carbon {
    double temp;
    double mass;
    rowvec::fixed<3> position;      
    rowvec::fixed<3> velocity;
    rowvec::fixed<3> force;
};

extern struct carbon *atom;

Определите переменную atom В одном из ваших исходных файлов:

struct carbon *atom = 0;

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

Пса Вместо того, чтобы иметь atom переменная в глобальном пространстве имен, вы можете поместить его в свое пространство имен:

namespace some_clever_name
{
    struct carbon { ... };
    extern carbon *atom;
}

И поместите это в исходный файл:

some_clever_name::carbon *some_clever_name::atom = 0;

Другие советы

Определение структуры должно быть в файле заголовка.

Вам нужно включить определение структуры carbon в файл заголовка, а затем включите этот файл заголовка в файлах (.h или же .cpp) где вы получаете эти ошибки неполного типа.

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

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

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

C ++ с самого начала был основан на C, и наследует от C простой стратегии компиляции: компилятор делает один проход, и ни компилятор, ни линкер не должны получить доступ к чему -либо, кроме файла, который они представлены. Когда C и Unix были впервые разработаны, адресные пространства были ограничены, а процессоры были медленнее, чем могли себе представить большинство людей - мой Kindle Fire - это довольно больший компьютер, чем все, что я использовал до 90 -х годов.

Поскольку они делали компилятор простым, вместо того, чтобы использовать более сложные схемы, такие как PL/I (один из предков C), они создали препроцессор и использование, включают файлы. Компилятор должен знать «форму» структуры, чтобы он мог генерировать код - например, если вы хотите получить доступ mass, вам нужно знать смещение с начала структуры. Таким образом, в C и C ++ вам нужно включить текстовое описание этой «формы».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top