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

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

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

Author24 — интернет-сервис помощи студентам
Всех приветствую. Есть такой код:
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.09.2022, 16:12
Ответы с готовыми решениями:

Вызов метода класса, расположенного в другом файле
У нас есть 2 файла ->Sourse.cpp and Sourse.h /*Sourse.cpp*/ #include...

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

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

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

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

13
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
метод статический. Поэтому можно его вызывать прямо от имени класса без создания экземпляра:
C++
1
CPlainInsteadView::Utf8ToCString(cstr,utf8Str);
0
Вездепух
Эксперт CЭксперт С++
12784 / 6662 / 1794
Регистрация: 18.10.2014
Сообщений: 16,854
16.09.2022, 18:33 4
Цитата Сообщение от КАВ Посмотреть сообщение
В самом cpp файле у меня есть методы этого класса. Один из них,которого не было в заголовочном файле
Цитата Сообщение от КАВ Посмотреть сообщение
Теперь вопрос,как его добавить в заголовочный файл
Не понял. Невозможно определить метод класса, который не объявлен заранее в определении класса. Это просто не скомпилируется.

Цитата Сообщение от КАВ Посмотреть сообщение
static bool Utf8ToCString(CString& cstr, const char* utf8Str)
Но это не метод класса. Это обычная функция. И раз она объявлена 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
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Эксперт С++
12784 / 6662 / 1794
Регистрация: 18.10.2014
Сообщений: 16,854
16.09.2022, 19:03 7
Цитата Сообщение от КАВ Посмотреть сообщение
Я его не где не вызывал,кроме того файла,где я его реализовывал,поэтому,как я понимаю,в заголовочном файле его можно было не описывать,но мне понадобилось обратиться к нему из другого файла.
Это прекрасно. Но почему вы его называете эту функцию "методом класса", в то время как никаким "методом класса" она не является?

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

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

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

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

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

---

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

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

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 10
Цитата Сообщение от КАВ Посмотреть сообщение
Хорошо,но вопрос,как эту функцию вписать в заголовочный файл,чтобы использовать в других файлах?
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
Сообщений: 340
16.09.2022, 21:57  [ТС] 11
Если вы хотите вызывать обычную функцию из другого файла, то значит вам придется убрать слово static из определения функции.
Да,я уже понял это. Это то,что нужно. Получается статические функции нельзя использовать за приделами моего файла,кроме статических методов классов?
0
Вездепух
Эксперт CЭксперт С++
12784 / 6662 / 1794
Регистрация: 18.10.2014
Сообщений: 16,854
16.09.2022, 22:06 12
Цитата Сообщение от КАВ Посмотреть сообщение
Получается статические функции нельзя использовать за приделами моего файла
Не совсем так.

Обычные функции, объявленные со словом 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
Сообщений: 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
Вездепух
Эксперт CЭксперт С++
12784 / 6662 / 1794
Регистрация: 18.10.2014
Сообщений: 16,854
16.09.2022, 23:31 14
Цитата Сообщение от КАВ Посмотреть сообщение
Хорошо,а почему если мы объявим функцию так:
[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
16.09.2022, 23:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.09.2022, 23:31
Помогаю со студенческими работами здесь

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

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

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

Проверка столкновений обращаясь к классу объекта
Хочу сделать игру платформер на c#, но не пойму как проверить столкновение у множества объектов...

Вызов методов классов друг у друга (вызов метода из другого класса)
Есть несколько классов, которые могут вызывать методы (функции) друг у друга. Логика: класс1 имеет...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru