C ++ Доступ к переменной, которая была объявлена / определена в одном исходном файле из другого исходного файла

0

У меня есть переменная, которую я пытаюсь использовать в исходном файле C++ под названием Spiral.cpp. Переменная была объявлена в файле заголовка, используя следующий код:

struct DataMessage{
    ...
    ::CORBA::Double radius;
    ...
};

внутри:

namespace STEERDataIDL{
    ...
}

Затем ему было присвоено значение в другом исходном файле Module.cpp, используя следующую строку:

radius = Interface.spiralRadius;

внутри case STEERDataIDL::SpiralPattern:

функции:

void Module::FormList(void){
    ...
    switch (this->InterCDNUSteerData.SteerMode)
{
          ....
      }
}

Как видно из приведенной выше строки, значение, данное переменной здесь, было взято из пользовательского ввода в графическом интерфейсе.

Как уже упоминалось, я пытаюсь использовать эту переменную в функции в исходном файле Spiral.cpp:

void Module::FormList(); /*This is the function in which 'radius' was given its value */
if(abs(someDistance) < (Data.radius + x)){
    // Do XYZ
}

Тем не менее, я получаю несколько ошибок компиляции, которые я не понимаю:

error 'module' не является именем класса или пространства имен (на void Module:: line)

'x' необъявленный идентификатор

слева от '.radius' должен иметь класс /struct/union, type - "unkown type"

Может ли кто-нибудь объяснить мне, что я здесь делаю неправильно? Что мне нужно сделать, чтобы исправить эти ошибки компиляции?

  • 1
    Что мне нужно сделать, чтобы исправить эти ошибки компиляции? Во-первых, вы должны опубликовать полный пример, который приведет к ошибкам, о которых вы говорите.
  • 0
    #include заголовок, в котором объявлена переменная / класс.
Показать ещё 1 комментарий
Теги:
compiler-errors

2 ответа

0

Вы должны включить заголовочный файл, в котором объявлены данные, в этом случае декларация данных будет выглядеть примерно так:

//globals.h
#include "DataMessage.h"
extern DataMessage Data;  //to indicate that Data will be created in a different cpp file and visible to other cpp files

Затем вы должны создать данные, созданные в файле cpp, который включает заголовочный файл, в котором была объявлена переменная Data, которая может выглядеть так:

//globals.cpp
#include "globals.h"
DataMessage Data;

теперь в Module.cpp у вас есть что-то вроде этого:

#include "globals.h"
...
void Module::FormList() {
  Data.radius = Interface.spiralRadius;  //notice how radius is accessible only through the Data variable
}

и в Spiral.cpp у вас должно быть что-то вроде этого:

#include "globals.h"
...
void Foo() {
  if(abs(someDistance) < (Data.radius + x)) {  //Data.radius is the same one across all files
    // Do XYZ
  }
}
  • 0
    Спасибо за Ваш ответ. Я дал ваш первый пункт, но я получаю разные ошибки компиляции для этого в зависимости от того, как я это делаю. Если я это сделаю: extern DataMessage Data; , Я получаю syntax error: missing ';' before 'Data' ... если я делаю extern struct DataMessage Data; Я получаю, что local classes cannot be used to declare 'extern' variables ...
0

Здесь есть ряд проблем.

  1. Вы определяете переменную TYPE (struct DataMessage....) в файле заголовка, но не объявляете сама переменную
  2. Переменная не может быть определена в файле заголовка, только объявлена для внешней ссылки за пределами пространства имен.
    extern struct STEERDataIDL::DataMessage Data;
  3. в Module.cpp вы, похоже, не ссылаетесь на переменную с именем "Данные" типа struct DataMessage нигде, даже если вы пытаетесь получить к ней доступ в Spiral.cpp
    struct STEERDataIDL::DataMessage Data;
  4. Вам не хватает закрывающей скобки в Spiral.cpp

Важно то, что все extern объявляются в области файлов. технически вы можете поместить extern struct STEERDataIDL::DataMessage Data; непосредственно перед линией, в которой вы используете переменную, при условии, что она может правильно разрешить область.

  • 0
    Спасибо за Ваш ответ. 1. Структура, определенная в заголовке, содержит около 80 переменных разных типов, которые используются в других местах программы и не вызывают никаких проблем ... и, конечно, я объявляю переменную внутри структуры с помощью строки ::CORBA::Double radius; ? 2. Я пытался использовать extern struct DataMessage Data; но получил ошибку компиляции, которая гласила, что «локальные классы не могут быть использованы для объявления переменных extern ... 3. В Module.cpp у меня есть строка: radius = Data.radius; хотя, возможно, мне нужно объявить это с помощью строка extern struct DataMessage Data; первая - 4. Ошибка копирования
  • 0
    Вы не предоставили достаточно информации в исходном вопросе. Вы не указали ни в одной из своих деклараций или определений, что крайне важно. Вы объявляете / определяете вещи в области видимости файла? сфера действия? класс области? объем пространства имен?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню