Глобальная динамически размещаемая структура в c ++ - PullRequest
0 голосов
/ 19 февраля 2012

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

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’

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

Ответы [ 4 ]

1 голос
/ 19 февраля 2012

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

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

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

1 голос
/ 19 февраля 2012

Исходный файл, в котором вы используете 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, включите файл заголовка, где структура и объявление extern, и это должно работать.

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

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

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

some_clever_name::carbon *some_clever_name::atom = 0;
1 голос
/ 19 февраля 2012

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

0 голосов
/ 19 февраля 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...