Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
 Аватар для leo7755
3 / 3 / 1
Регистрация: 12.02.2017
Сообщений: 81

Не работают публичные методы класса в разных файлах проекта

07.11.2021, 02:35. Показов 1088. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть класс PathsToFiles, разделённый на отдельные файлы:

paths.hpp - интерфейс
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// paths.hpp
 
#ifndef PATHS_HPP
#define PATHS_HPP
 
 
 
#include <string>
 
 
 
class PathsToFiles
{
private:
    std::string ban;
    std::string sa_mode_amx;
    std::string mta_map;
 
public:
    void SetPathToSampBan(std::string path);
    void SetPathToSaModeAmx(std::string path);
    void SetPathToMtaMap(std::string path);
 
    std::string GetPathToSampBan();
    std::string GetPathToSaModeAmx();
    std::string GetPathToMtaMap();
};
 
 
 
#endif // PATHS_HPP


paths.cpp - реализация
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// paths.cpp
 
 
 
#include "paths.hpp"
 
 
// set
 
void PathsToFiles::SetPathToSampBan(std::string path)
{
    ban = path;
}
 
void PathsToFiles::SetPathToSaModeAmx(std::string path)
{
    sa_mode_amx = path;
}
 
void PathsToFiles::SetPathToMtaMap(std::string path)
{
    mta_map = path;
}
 
// get
 
std::string PathsToFiles::GetPathToSampBan()
{
    return ban;
}
 
std::string PathsToFiles::GetPathToSaModeAmx()
{
    return sa_mode_amx;
}
 
std::string PathsToFiles::GetPathToMtaMap()
{
    return mta_map;
}


main.cpp - использование 1
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// main.cpp
 
 
 
#include "paths.hpp"
 
 
 
PLUGIN_EXPORT bool PLUGIN_CALL Load(void **ppData)
{
    std::string path_to_srv_exe = std::experimental::filesystem::current_path().string();
 
    // Создаём объект
    PathsToFiles PathsToFilesObj;
 
    // Устанавливаем через set-методы некоторую информацию
    PathsToFilesObj.SetPathToSampBan(path_to_srv_exe    + "\\samp.ban");
    PathsToFilesObj.SetPathToSaModeAmx(path_to_srv_exe  + "\\gamemodes\\sa_mode.amx");
    PathsToFilesObj.SetPathToMtaMap(path_to_srv_exe     + "\\scriptfiles\\mta\\*.map*");
 
    // Дебаг. Выводит нормально: path: D:\samp\Project SA\mode\win32\samp.ban
    logprintf("path: %s", PathsToFilesObj.GetPathToSampBan().c_str());
 
    return true;
}


banlist.cpp - использование 2
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// banlist.cpp
 
 
 
#include "paths.hpp"
 
 
 
// native GetBanList(const bans[]);
cell AMX_NATIVE_CALL Natives::GetBanList(AMX *amx, cell *params)
{
    std::ifstream handle;
 
    // Создаём объект
    PathsToFiles PathsToFilesObj;
 
    // Передаём в метод open то, что у нас есть в методе GetPathToSampBan
    handle.open(PathsToFilesObj.GetPathToSampBan());
 
    // Дебаг. И тут почему-то пусто 'path: '. Это как?
    logprintf("path: %s", PathsToFilesObj.GetPathToSampBan().c_str());
 
    if (!handle)
    {
        // и конечно же хэндл bad
        return 0;
    }
 
    //...
}


Почему get-метод класса выдал пустую строку в banlist.cpp? Хотя в main.cpp он вывел норм. Выходит так, что переменная-член обнулена. И так со всеми остальными методами класса (пустые строки)...
Я читал про статистические переменные-члены и продолжительность жизни объектов, но разве это мой случай? Как довести до ума, чтобы данный класс работал в разных частях проекта?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.11.2021, 02:35
Ответы с готовыми решениями:

Перечислимые типы в разных файлах проекта
Написал прогу: 1.срр - основной файл 2.h - файл с объявлениями функций 2.срр - файл с описанием функций я создаю перечислимый...

Как обеспечить видимость класса во всех файлах проекта
как мы знаем, с помощью этого синтаксиса : using MyClass=Class; создается алиас MyClass класса Class . Но, этот алиас виден только в...

Видимость созданного объекта класса в других файлах проекта
Здравствуйте, прошу помочь. знаком с С++, пытаюсь разобраться в С шарп. как и где необходимо создавать объект класса чтоб его...

6
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
07.11.2021, 02:55
Лучший ответ Сообщение было отмечено leo7755 как решение

Решение

Цитата Сообщение от leo7755 Посмотреть сообщение
Это как?
Так у вас два разных объекта.

Цитата Сообщение от leo7755 Посмотреть сообщение
чтобы данный класс работал в разных частях проекта?
При чем здесь класс, если здесь речь про объект?

Добавлено через 6 минут
Цитата Сообщение от leo7755 Посмотреть сообщение
C++
1
2
// Создаём объект
 PathsToFiles PathsToFilesObj;
Цитата Сообщение от leo7755 Посмотреть сообщение
C++
1
2
// Создаём объект
 PathsToFiles PathsToFilesObj;
Вот вы же сами два раза написали, что создаете объект. Объект конструируется с пустыми строками.

Или вы думали, что информация из одного объекта каким-то магическим образом должна оказаться во втором??! Как это?
Но вы же должны уже понимать, что нестатические члены класса - это данные объекта. У вас два объекта, у каждого эти переменные свои собственные.

Если нужно разделять эти данные, то просто сделайте объект глобальным.
1
 Аватар для leo7755
3 / 3 / 1
Регистрация: 12.02.2017
Сообщений: 81
07.11.2021, 23:15  [ТС]
Применил extern в paths.hpp, а в main.cpp определил объект глобально. Всё работает. Спасибо

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// paths.hpp
 
 
 
#ifndef PATHS_HPP
#define PATHS_HPP
 
 
 
#include <string>
 
 
 
class PathsToFiles
{
private:
    std::string ban;
 
public:
    void SetPathToSampBan(std::string path);
 
    std::string GetPathToSampBan();
};
 
extern PathsToFiles PathsToFilesObj;
 
 
 
#endif // PATHS_HPP
 
 
 
// main.cpp
 
 
 
#include "paths.hpp"
 
 
 
PathsToFiles PathsToFilesObj;
 
 
 
PLUGIN_EXPORT bool PLUGIN_CALL Load(void **ppData)
{
    std::string path_to_srv_exe = std::experimental::filesystem::current_path().string();
 
    PathsToFilesObj.SetPathToSampBan(path_to_srv_exe + "\\samp.ban");
 
    return true;
}
 
 
// banlist.cpp
 
 
 
#include "paths.hpp"
 
 
 
// native GetBanList(const bans[]);
cell AMX_NATIVE_CALL Natives::GetBanList(AMX *amx, cell *params)
{
    std::ifstream handle;
 
    handle.open(PathsToFilesObj.GetPathToSampBan());
 
    if (!handle)
    {
        return 0;
    }
 
    //...
}


Цитата Сообщение от DrOffset Посмотреть сообщение
Если нужно разделять эти данные, то просто сделайте объект глобальным.
А я сделал локальным объект. Теперь понятно что и как.
Но мне важна ещё одна вещь про класс - не нарушена ли инкапсуляция класса? Правильно ли создан мой класс?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
07.11.2021, 23:36
Цитата Сообщение от leo7755 Посмотреть сообщение
Но мне важна ещё одна вещь про класс - не нарушена ли инкапсуляция класса? Правильно ли создан мой класс?
Речь про PathsToFiles?
Да, с ним все нормально.
1
 Аватар для leo7755
3 / 3 / 1
Регистрация: 12.02.2017
Сообщений: 81
08.11.2021, 00:18  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Речь про PathsToFiles?
Да. Важно, чтобы в классе инкапсуляция не нарушалась, потому что по этой аналогии планирую делать др. классы (там где это необходимо) для проекта.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
08.11.2021, 00:26
leo7755, инкапсуляция не нарушается, но вот const для Get- методов вы куда-то потеряли.

Цитата Сообщение от leo7755 Посмотреть сообщение
по этой аналогии
А это вот пагубное дело. Думать надо каждый раз, никакие аналогии применять не нужно. Там, где одно решение нормально смотрится, примененное по аналогии в другом месте может все испортить.
0
 Аватар для leo7755
3 / 3 / 1
Регистрация: 12.02.2017
Сообщений: 81
08.11.2021, 00:32  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Думать надо каждый раз
Согласен
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.11.2021, 00:32
Помогаю со студенческими работами здесь

Экземпляр класса и его использование в разных исполнительных файлах
Здраствуйте, есть такая проблема мне нужно использовать один класс(или же экземпляр класса) в 2 или 3 исполнительных файлах. Я немного не...

В двух разных файлах реализуйте очередь в виде массива и связного списка. Создайте методы добавления и удаления элемента
В двух разных файлах реализуйте очередь в виде массива и связного списка. Создайте методы добавления и удаления элемента.

В двух разных файлах реализуйте стек в виде массива и связного списка. Создайте методы добавления и удаления элемента
В двух разных файлах реализуйте стек в виде массива и связного списка. Создайте методы добавления и удаления элемента

Два класса в разных файлах, один из которых находится в другом
Country.h #pragma once #include &quot;StarSystem.h&quot; class Country { private: StarSystem Territory; short Stage; int...

Некорректно работают методы класса
Ситуация такая: метод Size_Of_Packet запускается, но выводит некорректный результат. Он как будто вообще не понимает, какой разряд я ему...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru