17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 340
|
||||||
1 | ||||||
Вызов метода класса в другом файле, не обращаясь к самому классу16.09.2022, 16:12. Показов 1057. Ответов 13
Метки нет (Все метки)
Всех приветствую. Есть такой код:
0
|
16.09.2022, 16:12 | |
Ответы с готовыми решениями:
13
Вызов метода класса, расположенного в другом файле Groovy - Вызов в файле метода описанного в другом файле Вызов метода класса в лямбде-функции, вызываемой в другом методе этого же класса Вызов метода одного класса в другом классе Вызов статического метода класса в другом классе |
101 / 95 / 10
Регистрация: 31.08.2022
Сообщений: 1,014
|
|
16.09.2022, 17:40 | 2 |
думаю, что так
CPlainInsteadView mainclass; а дальше , через mainclass у вас есть описание класса, но нет его экземпляра в памяти
0
|
Модератор
13703 / 10906 / 6473
Регистрация: 18.12.2011
Сообщений: 29,115
|
||||||
16.09.2022, 17:57 | 3 | |||||
метод статический. Поэтому можно его вызывать прямо от имени класса без создания экземпляра:
0
|
Вездепух
12784 / 6662 / 1794
Регистрация: 18.10.2014
Сообщений: 16,854
|
|
16.09.2022, 18:33 | 4 |
Не понял. Невозможно определить метод класса, который не объявлен заранее в определении класса. Это просто не скомпилируется.
Но это не метод класса. Это обычная функция. И раз она объявлена static, то вызывать ее напрямую из других файлов вы не сможете вообще никак.
0
|
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 340
|
|
16.09.2022, 18:43 [ТС] | 5 |
Я его не где не вызывал,кроме того файла,где я его реализовывал,поэтому,как я понимаю,в заголовочном файле его можно было не описывать,но мне понадобилось обратиться к нему из другого файла. Я понял,что перед методом мне придётся указать имя класса. Просто я думал,что раз в реализации метода не указано CPlainInsteadView::,то его можно как-то ваызвать как обычную функцию.
0
|
1355 / 854 / 365
Регистрация: 26.02.2015
Сообщений: 3,806
|
||||||||||||||||
16.09.2022, 18:43 | 6 | |||||||||||||||
0
|
Вездепух
12784 / 6662 / 1794
Регистрация: 18.10.2014
Сообщений: 16,854
|
|
16.09.2022, 19:03 | 7 |
Это прекрасно. Но почему вы его называете эту функцию "методом класса", в то время как никаким "методом класса" она не является?
Пока что мы видим обычную функцию, никакого отношения к вашему классе не имеющую. При чем здесь вообще ваш класс? Если вы хотите вызывать обычную функцию из другого файла, то значит вам придется убрать слово static из определения функции.Это уже совсем другое. Если вам нужен статический метод класса, то тогда вам придется исправлять и заголовочный файл, и определение вашей функции. Да, все верно, ее можно вызывать как обычную функцию. Еще раз: раз в реализации метода не указано CPlainInsteadView:: , то это вообще НЕ метод, а обычная самостоятельная функция, никакого отношения к вашему классе не имеющая. --- Определитесь сначала, что именно вы хотите сделать. Обычную функцию или статический метод? У вас пока семь пятниц на неделе.
1
|
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 340
|
|
16.09.2022, 19:26 [ТС] | 8 |
Хорошо,но вопрос,как эту функцию вписать в заголовочный файл,чтобы использовать в других файлах?
0
|
Вездепух
12784 / 6662 / 1794
Регистрация: 18.10.2014
Сообщений: 16,854
|
||||||
16.09.2022, 19:29 | 9 | |||||
Если НЕ делать ее статическим методом класса? (Вы определились или нет?)
Если не делать ее статическим методом класса, то вам нужно 1. Убрать ключевое слово static из реализации этой функции в .cpp файле.2. Добавить в заголовочный файл
0
|
101 / 95 / 10
Регистрация: 31.08.2022
Сообщений: 1,014
|
||||||||||||||||
16.09.2022, 20:11 | 10 | |||||||||||||||
mainfunc.h
0
|
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 340
|
|
16.09.2022, 21:57 [ТС] | 11 |
0
|
Вездепух
12784 / 6662 / 1794
Регистрация: 18.10.2014
Сообщений: 16,854
|
|||||||||||
16.09.2022, 22:06 | 12 | ||||||||||
Не совсем так.
Обычные функции, объявленные со словом static , имеют внутреннее связывание. Функции с внутренним связыванием невозможно вызвать напрямую, т.е. к ним невозможно прилинковаться по имени. Тем не менее вы можете вызывать такие функции из других файлов через указатель (если сумеете получить такой указатель).Например
ptr() и попадать в foo , несмотря на то, что foo обладает внутренним связыванием. Но напрямую вызвать foo из других файлов мы не можем.Ключевое слово static имеет совершенно разные, совершенно никак друг с другом не связанные смыслы, когда оно используется с обычными функциями или с методами классов. Не нужно валить это все в одну кучу.Да, статические методы классов можно использовать где угодно.
0
|
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 340
|
|
16.09.2022, 23:10 [ТС] | 13 |
Хорошо,а почему если мы объявим функцию так:
[C++] //test.h class test {... } static void fu(); [/C++] А потом реализуем её в файле test.cpp,в который мы подключим наш h файл,после чего захотим использовать в файле test1.cpp,в который тоже включим test.h,компилятор в visual studio выдаст ошибку,что,мол,статическая функция объявлена,ноне определена,но не то,что её,к примеру,нельзя использовать в других файлах.
0
|
Вездепух
12784 / 6662 / 1794
Регистрация: 18.10.2014
Сообщений: 16,854
|
||||||
16.09.2022, 23:31 | 14 | |||||
В таком объявлении функция не имеет никакого отношения к классу, так что класс тут ни к чему. Это просто объявление
Кого "её"? В таком случае нет никакой "её". Функция с внутренним связыванием является локальной в каждом файле. В каждом файле она своя и ничего не знает о функциях с таким же именем других файлах. Таким образом в вашем test1.cpp вы объявляете свою независимую, локальную, внутреннюю fu , для которой вы не предоставляете определения. Об этом вам и говорит компилятор.То есть тут нет ошибки "нельзя использовать в других файлах" просто потому что тут нет и попытки "использовать в других файлах". Такой попытки и быть не может. Поэтому и ошибки такой быть не может. Это вы у себя в голове придумали, что такой код - это якобы попытка "использовать fu в других файлах". А на самом деле нет. Компилятор это видит совсем по-другому. Компилятор видит локальную функцию без определения. И жалуется на это.
0
|
16.09.2022, 23:31 | |
16.09.2022, 23:31 | |
Помогаю со студенческими работами здесь
14
Как одному классу узнать о другом в другом файле, если они не имеют общего наследования Полиморфизм: вызов метода базового класса, переопределенного метода и нового метода Проверка столкновений обращаясь к классу объекта Проверка столкновений обращаясь к классу объекта Вызов методов классов друг у друга (вызов метода из другого класса) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |