Перейти к содержанию
    

С++ наверное, простой вопрос. Внутри

21 минуту назад, Метценгерштейн сказал:

m- у нас указатель, т.к. new.

Foo.cpp

A* m = nullptr; // или NULL в зависимости от стандарта C++

...
  
void init() {
...
  m = new A();
...
}

Boo.cpp
  
extern A* m;

void work() {
...
  m->loop();
...
}

Если несколько файлов, где должен использоваться m, то поместить extern в заголовочный файл, который затем подключать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 minutes ago, Метценгерштейн said:

вот в начале файла идет объявление: . . . 

--- A_class.hpp -------

. . . . .  
extern A *m;

 

--------- main.cpp ------ 
#include "A_class.hpp"
  
A *m;

main()

{ 

m = new A();

. . . 



m->Stop();

delete m;

}



----- module use_class_A.cpp ------

#include "A_class.hpp"

if( m != NULL ) m->Go();

. . . .

мог нахомутать, но в общем вроде так.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может лучше удочкой научится пользоваться, чем рыбу ждать ?

https://www.ozon.ru/context/detail/id/140891511/

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, x893 said:

Может лучше удочкой научится пользоваться, чем рыбу ждать ?

Лафоре у меня есть. Но читать всё и до конца времени нет- надо делать задачу.

И спасибо всем, проброшу как экстерн ее. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

46 минут назад, k155la3 сказал:

Отработайте "механизм" на том что знакомо, на структурах, а затем их "плавно" преобразовать в класс, если это еще потребуется.

Вообще-то структура в си++ - это то же самое, что класс. Единственное отличие между ними: в struct область видимости по-умолчанию - public, в class - private. Других отличий нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

extern переменная типа класса и/или указателя на класс/структуру в хедере этого же класса - обычный прием, так что без проблем...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Метценгерштейн сказал:

объект m создан.

m у вас не объект, а указатель на объект класса A. А объект будет == *m

 

23 минуты назад, Метценгерштейн сказал:

Лафоре у меня есть. Но читать всё и до конца времени нет- надо делать задачу.

Вам надо язык сначала изучить. си++. А решать какую-то задачу ещё рано.

35 минут назад, Метценгерштейн сказал:

вот в начале файла идет объявление:

myClass* m;

В начале какого файла? Чтобы какое-то объявление было видимо в разных .c-файлах, нужно объявлять в .h, а потом эти .h подключать в нужные .c.

И тип данных (структуру/класс) - в .h и объявление переменных (как глобальных объектов так и глобальных указателей на них) - тоже в .h.

А уже определение переменных - в .c.

 

PS: Это основы языка си, которые Вы должны были узнать на этапе его освоения. "Решать какие-то задачи" не зная языка программирования - это как писать роман не зная языка на котором пишешь.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 minutes ago, jcxz said:

. . .  структура в си++ - это то же самое, что класс. . . .

Да, "плавно" как раз в этом смысле :)  "брюки превращаются  . . .  брюки превращаются в classЫ . . . "

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, haker_fox said:

Сделайте синглтон.

К слову, именно такой синглтон, со статик объектом внутри функции, чуток избыточен.

Там компилятор вставляет флажок, и при каждом обращении проверяет, нужно ли вызывать конструктор объекта.

 

Если объявлять глобальную переменную, то она инициализируется в стартапе, и этой проверки не будет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, esaulenka said:

Там компилятор вставляет флажок,

Да, я знаю. Но может быть это прога для QT и крутится на Core i-9.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 hours ago, Метценгерштейн said:

m- у нас указатель, т.к. new.

А как мне его глобально узнать определен или нет?

Если он определяется вне всех блоков { } - значит он глобальный.

Если же внутри какого-нибудь блока - в теле функции, цикла, условного оператора и т.п. - значит локальный. Область видимости в этом случае - блок. Вне его он не существует, обратиться к нему извне  нельзя.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 3/16/2020 at 12:43 PM, Grizzly said:

Если несколько файлов, где должен использоваться m, то поместить extern в заголовочный файл, который затем подключать.

Идея рабочая, должно быть, но возникла проблема-

On 3/16/2020 at 12:43 PM, Grizzly said:

Boo.cpp

extern A* m;

в классе, где мне надо это использовать, ошибка, что не видит класса

error: 'А' does not name a type
 extern А* m;

т.е. мне надо указать хидер этого класса?

Но и тут не получается- в структуре файлов он лежит в ветке файлов далеко. Надо или в компилятор прописывать пути к хидеру, или как-то сразу в #include указать путь отностительный до него.
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Метценгерштейн сказал:

Но и тут не получается- в структуре файлов он лежит в ветке файлов далеко. Надо или в компилятор прописывать пути к хидеру, или как-то сразу в #include указать путь отностительный до него.

Разумеется, объявление должно быть видно. Ну так пропишите путь до нужно директории в вашей IDE или же в самом файле, где объявляете через extern. Это же обычная практика.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 hours ago, Метценгерштейн said:

. . . Но и тут не получается- в структуре файлов он лежит в ветке файлов далеко. Надо или в компилятор прописывать пути к хидеру, или как-то сразу в #include указать путь отностительный до него.
 

В своих #include xxxxx как правило прописывать путь ни абсолютный, ни относительный, не бывает необходимости.

Смотрите опции проекта (IDE) или переменные среды, там должны быть указаны стандартные пути "обхода" для поиска include.

Их можно прописать достаточно много (зависит от среды).

Есть макро-переменные (зависит от производителя IDE), вроед "$CURRENT_DIR", "$PROJECT_DIR", "$OUTPUT_DIR" итп.

Они могут использоваться в задании путей поиска итд.

Порядок перечисления этих путей может иметь значение. (повтор)

ps

"лежит далеко" - надо учитывать "цепочечное" (иерархическое) включение по #include. Если в сложном, наследуемом, классе каждый класс будет объявляться с инклудами "родителей", то у пра-пра-. . .-внучика в заголовке должен быть только его инкулд "включающий" его "родителя", но не всех "пра-отцов" :biggrin: 

ps-ps "Авраам родил Исаака; Исаак родил Иакова; Иаков родил Иуду и братьев его."   Не надо ... :biggrin:

image.thumb.png.f365ba45ec26c4aafd7df8cb222a56f1.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 hours ago, Метценгерштейн said:

Надо или в компилятор прописывать пути к хидеру

Если собираете проект в IDE, то в настройках проекта должны быть перечислены пути ко всем папкам, где препроцессор должен будет искать хидеры. В Keil это называется Include Paths. В IAR - Additional include directories. Пути прописываются, как правило, относительные - т.е. относительно папки с проектом. Так проект получается переносимым и независимым от места расположения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...