Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/40: Рейтинг темы: голосов - 40, средняя оценка - 4.83
29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231

Как передать ссылку на объект в класс

20.02.2013, 00:39. Показов 8440. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Подскажите, пожалуйста, почему не работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
log.h
class LogClass
{
public:
    bool InitializeLog();
    void Write(char*);
private:
    std::ofstream m_fout;
};
main.h
....
LogClass* Log;
Log = new LogClass;
Log.InitializeLog();
ClassA->Function(&Log);
....
 
ClassA.cpp
bool SystemClass::Function(LogClass* Log)
{
    Log->Write("Hello");
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.02.2013, 00:39
Ответы с готовыми решениями:

Как передать ссылку на объект в функцию
Есть два класса допустим Entitit и Map, в Map есть переменная допустим Time которая изменяется каждую секунду на +1, требуется передать...

Как в порождаемый класс передать ссылку на основной класс?
Основной класс: #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include "mypaint.h" namespace Ui { ...

Как в пользовательский тэг передать ссылку на объект созданный в скриплете?
В jsp, в скриплете создается объект. Можно ли его как-то передать в пользовательский тэг и там обработать этот объект (обратиться к его...

29
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
20.02.2013, 00:58
Цитата Сообщение от Helldrg Посмотреть сообщение
ClassA->Function(&Log);
Log и так объявлен как указатель, не надо брать у него адрес
1
29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
20.02.2013, 01:02  [ТС]
если написать так
C++
1
ClassA->Function(Log);
То напишет: аргумент типа LogClass* несовместим с параметром типа LogClass*
И что делать в этом случае?)
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.02.2013, 01:09
Не видно, что где подключено.
1
29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
20.02.2013, 01:25  [ТС]
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
log.h
#include <fstream>
class LogClass
{
public:
    bool InitializeLog();
    void Write(char*);
void ShutdownLog();
private:
    std::ofstream m_fout;
};
 
 
log.cpp
#include "log.h"
    bool LogClass::InitializeLog()
{
m_fout.open("file.txt");
}
    void LogClass::Write(char* errorText)
{
m_fout << errorText << std::endl;
}
void LogClass::ShutdownLog()
{
m_fout.close();
}
private:
    std::ofstream m_fout;
};
 
 
main.h
#include "Cclassa.h"
#include "logclass.h"
int main()
{
 
LogClass* Log;
Log = new LogClass;
Log.InitializeLog();
Cclassa* classa;
classa = new Cclassa;
classa->Function(&Log);
Log.ShutdownLog();
return 0;
 }
 
 
CclassA.cpp
#include "cclassa.h"
bool SystemClass::Function(LogClass* Log)
{
    Log->Write("Hello");
return true;
}
 
cclassa.h
#include "logclass.h"
class Cclassa
{
public:
    bool Function(LogClass*);
};
Типа такого
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.02.2013, 01:28
Где-то лишнее подключение. logclass.h не вижу... Что там?
1
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
20.02.2013, 01:31
ссылки тут и близко не используются.
Не стоит путать оператор & и объявление ссылок.

Цитата Сообщение от alsav22 Посмотреть сообщение
Где-то лишнее подключение. logclass.h не вижу... Что там?
в этой строчке
Цитата Сообщение от Helldrg Посмотреть сообщение
main.h
#include "Cclassa.h"
#include "logclass.h"
тут "Cclassa.h" в свою очередь второй раз инклудит логкласс
1
29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
20.02.2013, 01:31  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Где-то лишнее подключение. logclass.h не вижу... Что там?
Бывают лишние подключения?) Так то да у меня в двух местах подключается, а как этого избегать?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.02.2013, 01:33
И вот это неправильно.
Цитата Сообщение от Helldrg Посмотреть сообщение
Log.InitializeLog();
Цитата Сообщение от Helldrg Посмотреть сообщение
Log.ShutdownLog();
Log же указатель. Значит:
C++
1
2
Log ->InitializeLog();
Log ->ShutdownLog();
1
29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
20.02.2013, 01:38  [ТС]
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
в этой строчке
Сообщение от Helldrg
main.h
#include "Cclassa.h"
#include "logclass.h"
тут "Cclassa.h" в свою очередь второй раз инклудит логкласс
Я убрал от туда инклюд у меня теперь:
error C2039: 'Log' : is not a member of 'LogClass'

Добавлено через 1 минуту
а нет))
Теперь у меня запускается, но вырубается сразу

Добавлено через 52 секунды
Run-Time Check Failure #3 - The variable 'Log' is being used without being initialized.

Добавлено через 34 секунды
Ураа работает))

Добавлено через 1 минуту
Я просто строчку закоментил одну спасибо большое!!!
P.S.:А такой способ ведения ошибок нормальный или другой можете посоветовать?)
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.02.2013, 01:42
Цитата Сообщение от Helldrg Посмотреть сообщение
но вырубается сразу
В main(), перед return 0; поставьте system("pause");

Добавлено через 3 минуты
Цитата Сообщение от Helldrg Посмотреть сообщение
P.S.:А такой способ ведения ошибок нормальный или другой можете посоветовать?)
Такой - это какой?
0
29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
20.02.2013, 10:03  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Сообщение от Helldrg
P.S.:А такой способ ведения ошибок нормальный или другой можете посоветовать?)
Такой - это какой?
ну у меня есть класс, который в файл будет записывать ошибку например:
C++
1
2
3
4
5
6
CclassB* ClassB = new CclassB;
if(!ClassB)
{
Log->Write("Номер ошибки","Название ошибки","текст ошибки","рекомендации по устранению");
return 0;
}
У меня такой способ ведения ошибок, подскажите, может есть что нибудь более универсальное))
0
Эксперт С++
 Аватар для ITcrusader
179 / 165 / 21
Регистрация: 12.02.2013
Сообщений: 410
20.02.2013, 11:45
Цитата Сообщение от Helldrg Посмотреть сообщение
Бывают лишние подключения?) Так то да у меня в двух местах подключается, а как этого избегать?
Твои заголовочные файлы должны иметь следующий вид (пусть имя заголовочного файла: "Header.h"):

C++
1
2
3
4
5
6
7
#pragma once
#ifndef HEADER_H
#define HEADER_H
 
// тут все содержимое заголовочного файла...
 
#endif
Тогда даже если ты случайно этот файл дважды включишь в единицу трансляции, он по факту заинклудится один раз
1
29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
20.02.2013, 12:30  [ТС]
Спасибо большое! Полезная вещь!!!
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.02.2013, 14:51
Это способ применять следует, но это не исключает множественности включений. Это работает для компилятора, который в каждую единицу времени видит одну единицу трансляции, поэтому и сработает, если двойные включения находятся в одном файле. Если же двойные включения в разных файлах, то этот способ уже не поможет, потому что для компилятора всё будет нормально. Увидит только компоновщик, который видит все файлы.
Цитата Сообщение от ITcrusader Посмотреть сообщение
а как этого избегать?
Не помещать реализации (в частности реализации специализаций методов-функций) в .h файлы, только прототипы (исключения для шаблонов). Следить, и компоновщик подскажет.
1
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
20.02.2013, 20:38
Цитата Сообщение от alsav22 Посмотреть сообщение
Это способ применять следует, но это не исключает множественности включений. Это работает для компилятора, который в каждую единицу времени видит одну единицу трансляции, поэтому и сработает, если двойные включения находятся в одном файле. Если же двойные включения в разных файлах, то этот способ уже не поможет, потому что для компилятора всё будет нормально. Увидит только компоновщик, который видит все файлы.
Ничего не понял, короче, можно пример, когда этот способ не сработает.
Вообще, инклуд-guardы хороши, но лучше всяких guardов поможет просто держать в голове, какие файлы есть в проекте. Какие заголовки куда подключаются. И по возможности самому контролировать это, не включая второй раз заголовок, который уже включён внутри одного из заголовков проекта.
Вообще, если есть возможность, то избегать вложенных инклудов внутри h-файлов,

Просто надо держать в голове все *.с файлы, которые их используют данный заголовок и в них обеспечивать подключение заголовков, от которых зависит данный в нужном порядке.
1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.02.2013, 20:57
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Ничего не понял, короче, можно пример, когда этот способ не сработает.
.h файл, в нём определение (функции, переменной и т.п.). Присутствует инклуд-guard. Это файл подключен в нескольких файлах .cpp. Никаой инклуд-guard не спасёт от множественного определения.
1
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
20.02.2013, 21:00
так а нефиг в h-файлах определять переменные и функции. Никогда, даже если один раз инклудится он в проекте.
я о таком даже подумать не мог, когда отвечал на твоё сообщение.
Прототипы функций, объявления структур, классов и объединений, объявление extern переменных, макросы и дефайны - вот что должно быть в h-файле
1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.02.2013, 21:18
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
я о таком даже подумать не мог, когда отвечал на твоё сообщение.
Ты не мог, а другие спошь и рядом делают. Недавняя тема: поместил методы специализации класса, вместе с шаблонами, в .h файл и подключил его к нескольким .cpp. С шаблонами так и нужно, а специализация давала множественное определение. Надеются на инклуд-guard.

Добавлено через 5 минут
Специализация шаблона
1
29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
22.02.2013, 16:04  [ТС]
Вы имеете ввиду реализацию класса в .сpp делать а прототипы в .h?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.02.2013, 16:04
Помогаю со студенческими работами здесь

Как передать ссылку по клику в другой класс?
как передать ссылку по клику в другой класс есть класс парсера вот часть кода protected InputStream getInputStream() { ...

Как правильно передать ссылку в другой класс
Добрый день! Есть класс class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { @IBOutlet...

Как из main передать объект в класс
В классе main я создал объект класса Company public class Main { public static void main(String args) { Company...

Как передать массив в функцию и класс в объект?
Задача- треугольники у нас, заданы точками которые классы. Надо создать массив из них и вычислить какие из них какого вида и найти маx и...

Как передать объект с формы на форму (из класса в класс)?
Всем привет. Сижу мучаюсь, сейчас пойду в книжках ответ искать. На форме 1 по клику открывается, через диалог, форма 2. На форме 2...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru