С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344

Вызов метода класса в другом файле, не обращаясь к самому классу

16.09.2022, 16:12. Показов 1301. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всех приветствую. Есть такой код:
C++
1
2
3
4
5
6
7
8
9
class CPlainInsteadView : public CFormView
{
protected: // создать только из сериализации
    CPlainInsteadView();
    DECLARE_DYNCREATE(CPlainInsteadView)
 
public:
...
}
В самом cpp файле у меня есть методы этого класса. Один из них,которого не было в заголовочном файле: static bool Utf8ToCString(CString& cstr, const char* utf8Str). Теперь вопрос,как его добавить в заголовочный файл,чтобы в другом файле можно было вызвать просто Utf8ToCString(cstr,utf8Str); Пытался объявить её вне класса в h файле,но тогда появляется ошибка,что статическая функция объявлена,но не определена. Прошу прощение за возможно очень глупый вопрос,просто я почти не знаю c++,но есть один не мой проект,который хотелось бы доработать. Заранее всем огромное спасибо за помощь.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.09.2022, 16:12
Ответы с готовыми решениями:

Вызов метода класса, расположенного в другом файле
У нас есть 2 файла ->Sourse.cpp and Sourse.h /*Sourse.cpp*/ #include "C:\Users\USER\Desktop\define.h" int main() { ...

Groovy - Вызов в файле метода описанного в другом файле
Вот код загрузки файла в Groovy взятый из книги Башар Абдул-Джавада ... (с небольшой правкой) //chislo.groovy package groovy import...

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

13
101 / 95 / 10
Регистрация: 31.08.2022
Сообщений: 1,014
16.09.2022, 17:40
думаю, что так

CPlainInsteadView mainclass;
а дальше , через mainclass

у вас есть описание класса, но нет его экземпляра в памяти
0
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
16.09.2022, 17:57
метод статический. Поэтому можно его вызывать прямо от имени класса без создания экземпляра:
C++
1
CPlainInsteadView::Utf8ToCString(cstr,utf8Str);
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
16.09.2022, 18:33
Цитата Сообщение от КАВ Посмотреть сообщение
В самом cpp файле у меня есть методы этого класса. Один из них,которого не было в заголовочном файле
Цитата Сообщение от КАВ Посмотреть сообщение
Теперь вопрос,как его добавить в заголовочный файл
Не понял. Невозможно определить метод класса, который не объявлен заранее в определении класса. Это просто не скомпилируется.

Цитата Сообщение от КАВ Посмотреть сообщение
static bool Utf8ToCString(CString& cstr, const char* utf8Str)
Но это не метод класса. Это обычная функция. И раз она объявлена static, то вызывать ее напрямую из других файлов вы не сможете вообще никак.
0
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
16.09.2022, 18:43  [ТС]
Я его не где не вызывал,кроме того файла,где я его реализовывал,поэтому,как я понимаю,в заголовочном файле его можно было не описывать,но мне понадобилось обратиться к нему из другого файла. Я понял,что перед методом мне придётся указать имя класса. Просто я думал,что раз в реализации метода не указано CPlainInsteadView::,то его можно как-то ваызвать как обычную функцию.
0
 Аватар для Nishen
1357 / 856 / 365
Регистрация: 26.02.2015
Сообщений: 3,813
16.09.2022, 18:43
C++
1
2
3
4
5
6
7
8
// some.hpp
class SomeClass
{
public:
    void method() const;
};
 
void function();
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// some.cpp
#include "some.hpp"
 
#include <iostream>
 
void SomeClass::method() const
{
    std::cout << "It's a method of the SomeClass class\n";
}
 
void function()
{
    std::cout << "It's a simple function in the global namespace int the some.hpp file\n";
}
C++
1
2
3
4
5
6
7
8
9
10
// main.cpp
 
#include "some.hpp"
 
int main()
{
    SomeClass obj;
    obj.method();
    function();
}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
16.09.2022, 19:03
Цитата Сообщение от КАВ Посмотреть сообщение
Я его не где не вызывал,кроме того файла,где я его реализовывал,поэтому,как я понимаю,в заголовочном файле его можно было не описывать,но мне понадобилось обратиться к нему из другого файла.
Это прекрасно. Но почему вы его называете эту функцию "методом класса", в то время как никаким "методом класса" она не является?

Пока что мы видим обычную функцию, никакого отношения к вашему классе не имеющую. При чем здесь вообще ваш класс?

Цитата Сообщение от КАВ Посмотреть сообщение
но мне понадобилось обратиться к нему из другого файла.
Если вы хотите вызывать обычную функцию из другого файла, то значит вам придется убрать слово static из определения функции.

Цитата Сообщение от КАВ Посмотреть сообщение
Я понял,что перед методом мне придётся указать имя класса.
Это уже совсем другое. Если вам нужен статический метод класса, то тогда вам придется исправлять и заголовочный файл, и определение вашей функции.

Цитата Сообщение от КАВ Посмотреть сообщение
Просто я думал,что раз в реализации метода не указано CPlainInsteadView::,то его можно как-то ваызвать как обычную функцию.
Да, все верно, ее можно вызывать как обычную функцию.

Еще раз: раз в реализации метода не указано CPlainInsteadView::, то это вообще НЕ метод, а обычная самостоятельная функция, никакого отношения к вашему классе не имеющая.

---

Определитесь сначала, что именно вы хотите сделать. Обычную функцию или статический метод? У вас пока семь пятниц на неделе.
1
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
16.09.2022, 19:26  [ТС]
Хорошо,но вопрос,как эту функцию вписать в заголовочный файл,чтобы использовать в других файлах?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
16.09.2022, 19:29
Цитата Сообщение от КАВ Посмотреть сообщение
Хорошо,но вопрос,как эту функцию вписать в заголовочный файл,чтобы использовать в других файлах?
Если НЕ делать ее статическим методом класса? (Вы определились или нет?)

Если не делать ее статическим методом класса, то вам нужно

1. Убрать ключевое слово static из реализации этой функции в .cpp файле.
2. Добавить в заголовочный файл

C++
1
bool Utf8ToCString(CString& cstr, const char* utf8Str);
Все. Вызывайте на здоровье откуда угодно.
0
101 / 95 / 10
Регистрация: 31.08.2022
Сообщений: 1,014
16.09.2022, 20:11
Цитата Сообщение от КАВ Посмотреть сообщение
Хорошо,но вопрос,как эту функцию вписать в заголовочный файл,чтобы использовать в других файлах?
mainfunc.h

C++
1
String Utf8ToCString(cstr,utf8Str)
mainfunc.cpp

C++
1
2
3
4
String Utf8ToCString(cstr,utf8Str)
{
......
}
теперь в любой файл втыкаете
C++
1
#include mainfunc.h
и юзаете свою функцию...
0
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
16.09.2022, 21:57  [ТС]
Если вы хотите вызывать обычную функцию из другого файла, то значит вам придется убрать слово static из определения функции.
Да,я уже понял это. Это то,что нужно. Получается статические функции нельзя использовать за приделами моего файла,кроме статических методов классов?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
16.09.2022, 22:06
Цитата Сообщение от КАВ Посмотреть сообщение
Получается статические функции нельзя использовать за приделами моего файла
Не совсем так.

Обычные функции, объявленные со словом static, имеют внутреннее связывание. Функции с внутренним связыванием невозможно вызвать напрямую, т.е. к ним невозможно прилинковаться по имени. Тем не менее вы можете вызывать такие функции из других файлов через указатель (если сумеете получить такой указатель).

Например

C++
1
2
// test.h
extern void (*ptr)();
C++
1
2
3
4
// test.cpp
static void foo() {}
 
void (*ptr)() = foo;
Теперь мы где угодно можем вызывать ptr() и попадать в foo, несмотря на то, что foo обладает внутренним связыванием. Но напрямую вызвать foo из других файлов мы не можем.

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

Да, статические методы классов можно использовать где угодно.
0
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
16.09.2022, 23:10  [ТС]
Хорошо,а почему если мы объявим функцию так:
[C++]
//test.h
class test {...
}
static void fu();
[/C++]
А потом реализуем её в файле test.cpp,в который мы подключим наш h файл,после чего захотим использовать в файле test1.cpp,в который тоже включим test.h,компилятор в visual studio выдаст ошибку,что,мол,статическая функция объявлена,ноне определена,но не то,что её,к примеру,нельзя использовать в других файлах.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
16.09.2022, 23:31
Цитата Сообщение от КАВ Посмотреть сообщение
Хорошо,а почему если мы объявим функцию так:
[C++]
//test.h
class test {...
}
static void fu();
[/C++]
В таком объявлении функция не имеет никакого отношения к классу, так что класс тут ни к чему. Это просто объявление

C++
1
static void fu();
без определения.

Цитата Сообщение от КАВ Посмотреть сообщение
после чего захотим использовать в файле test1.cpp,в который тоже включим test.h,компилятор в visual studio выдаст ошибку,что,мол,статическая функция объявлена,ноне определена,но не то,что её,к примеру,нельзя использовать в других файлах.
Кого "её"? В таком случае нет никакой "её".

Функция с внутренним связыванием является локальной в каждом файле. В каждом файле она своя и ничего не знает о функциях с таким же именем других файлах. Таким образом в вашем test1.cpp вы объявляете свою независимую, локальную, внутреннюю fu, для которой вы не предоставляете определения. Об этом вам и говорит компилятор.

То есть тут нет ошибки "нельзя использовать в других файлах" просто потому что тут нет и попытки "использовать в других файлах". Такой попытки и быть не может. Поэтому и ошибки такой быть не может. Это вы у себя в голове придумали, что такой код - это якобы попытка "использовать fu в других файлах". А на самом деле нет. Компилятор это видит совсем по-другому. Компилятор видит локальную функцию без определения. И жалуется на это.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.09.2022, 23:31
Помогаю со студенческими работами здесь

Вызов метода одного класса в другом классе
Привет всем Когда запускаю, то в методе GetOut() вместо имени человека выводится цифра 1 Помогите пожалуйста, заранее спасибо. ...

Вызов статического метода класса в другом классе
Как вызвать статический метод из одного класса в другом? вот этот код не работает class A{ static function vivod($msg){ ...

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

Полиморфизм: вызов метода базового класса, переопределенного метода и нового метода
В базовом классе метод помечен как virtual. Насколько я понял из книги: override означает, что метод не утрачивает связи с базовым...

Проверка столкновений обращаясь к классу объекта
Знаю, что как-то можно проверять столкновение не обращаясь лично к объекту по имени, а как-то по его классу или что-то в этом роде. Делаю...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru