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

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

16.09.2022, 16:12. Показов 1348. Ответов 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
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
16.09.2022, 17:57
метод статический. Поэтому можно его вызывать прямо от имени класса без создания экземпляра:
C++
1
CPlainInsteadView::Utf8ToCString(cstr,utf8Str);
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12943 / 6810 / 1821
Регистрация: 18.10.2014
Сообщений: 17,234
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
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,816
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
12943 / 6810 / 1821
Регистрация: 18.10.2014
Сообщений: 17,234
16.09.2022, 19:03
Цитата Сообщение от КАВ Посмотреть сообщение
Я его не где не вызывал,кроме того файла,где я его реализовывал,поэтому,как я понимаю,в заголовочном файле его можно было не описывать,но мне понадобилось обратиться к нему из другого файла.
Это прекрасно. Но почему вы его называете эту функцию "методом класса", в то время как никаким "методом класса" она не является?

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

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

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

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

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

---

Определитесь сначала, что именно вы хотите сделать. Обычную функцию или статический метод? У вас пока семь пятниц на неделе.
1
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
16.09.2022, 19:26  [ТС]
Хорошо,но вопрос,как эту функцию вписать в заголовочный файл,чтобы использовать в других файлах?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12943 / 6810 / 1821
Регистрация: 18.10.2014
Сообщений: 17,234
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
12943 / 6810 / 1821
Регистрация: 18.10.2014
Сообщений: 17,234
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
12943 / 6810 / 1821
Регистрация: 18.10.2014
Сообщений: 17,234
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru