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

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

20.02.2013, 00:39. Показов 8482. Ответов 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,532
Записей в блоге: 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,532
Записей в блоге: 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,532
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru