Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
Helldrg
54 / 54 / 1
Регистрация: 10.01.2011
Сообщений: 1,080
20.02.2013, 00:39     Как передать ссылку на объект в класс #1
Здравствуйте! Подскажите, пожалуйста, почему не работает:
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");
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
20.02.2013, 00:58     Как передать ссылку на объект в класс #2
Цитата Сообщение от Helldrg Посмотреть сообщение
ClassA->Function(&Log);
Log и так объявлен как указатель, не надо брать у него адрес
Helldrg
54 / 54 / 1
Регистрация: 10.01.2011
Сообщений: 1,080
20.02.2013, 01:02  [ТС]     Как передать ссылку на объект в класс #3
если написать так
C++
1
ClassA->Function(Log);
То напишет: аргумент типа LogClass* несовместим с параметром типа LogClass*
И что делать в этом случае?)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.02.2013, 01:09     Как передать ссылку на объект в класс #4
Не видно, что где подключено.
Helldrg
54 / 54 / 1
Регистрация: 10.01.2011
Сообщений: 1,080
20.02.2013, 01:25  [ТС]     Как передать ссылку на объект в класс #5
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*);
};
Типа такого
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.02.2013, 01:28     Как передать ссылку на объект в класс #6
Где-то лишнее подключение. logclass.h не вижу... Что там?
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
20.02.2013, 01:31     Как передать ссылку на объект в класс #7
ссылки тут и близко не используются.
Не стоит путать оператор & и объявление ссылок.

Цитата Сообщение от alsav22 Посмотреть сообщение
Где-то лишнее подключение. logclass.h не вижу... Что там?
в этой строчке
Цитата Сообщение от Helldrg Посмотреть сообщение
main.h
#include "Cclassa.h"
#include "logclass.h"
тут "Cclassa.h" в свою очередь второй раз инклудит логкласс
Helldrg
54 / 54 / 1
Регистрация: 10.01.2011
Сообщений: 1,080
20.02.2013, 01:31  [ТС]     Как передать ссылку на объект в класс #8
Цитата Сообщение от alsav22 Посмотреть сообщение
Где-то лишнее подключение. logclass.h не вижу... Что там?
Бывают лишние подключения?) Так то да у меня в двух местах подключается, а как этого избегать?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.02.2013, 01:33     Как передать ссылку на объект в класс #9
И вот это неправильно.
Цитата Сообщение от Helldrg Посмотреть сообщение
Log.InitializeLog();
Цитата Сообщение от Helldrg Посмотреть сообщение
Log.ShutdownLog();
Log же указатель. Значит:
C++
1
2
Log ->InitializeLog();
Log ->ShutdownLog();
Helldrg
54 / 54 / 1
Регистрация: 10.01.2011
Сообщений: 1,080
20.02.2013, 01:38  [ТС]     Как передать ссылку на объект в класс #10
Цитата Сообщение от 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.:А такой способ ведения ошибок нормальный или другой можете посоветовать?)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.02.2013, 01:42     Как передать ссылку на объект в класс #11
Цитата Сообщение от Helldrg Посмотреть сообщение
но вырубается сразу
В main(), перед return 0; поставьте system("pause");

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

C++
1
2
3
4
5
6
7
#pragma once
#ifndef HEADER_H
#define HEADER_H
 
// тут все содержимое заголовочного файла...
 
#endif
Тогда даже если ты случайно этот файл дважды включишь в единицу трансляции, он по факту заинклудится один раз
Helldrg
54 / 54 / 1
Регистрация: 10.01.2011
Сообщений: 1,080
20.02.2013, 12:30  [ТС]     Как передать ссылку на объект в класс #14
Спасибо большое! Полезная вещь!!!
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.02.2013, 14:51     Как передать ссылку на объект в класс #15
Это способ применять следует, но это не исключает множественности включений. Это работает для компилятора, который в каждую единицу времени видит одну единицу трансляции, поэтому и сработает, если двойные включения находятся в одном файле. Если же двойные включения в разных файлах, то этот способ уже не поможет, потому что для компилятора всё будет нормально. Увидит только компоновщик, который видит все файлы.
Цитата Сообщение от ITcrusader Посмотреть сообщение
а как этого избегать?
Не помещать реализации (в частности реализации специализаций методов-функций) в .h файлы, только прототипы (исключения для шаблонов). Следить, и компоновщик подскажет.
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
20.02.2013, 20:38     Как передать ссылку на объект в класс #16
Цитата Сообщение от alsav22 Посмотреть сообщение
Это способ применять следует, но это не исключает множественности включений. Это работает для компилятора, который в каждую единицу времени видит одну единицу трансляции, поэтому и сработает, если двойные включения находятся в одном файле. Если же двойные включения в разных файлах, то этот способ уже не поможет, потому что для компилятора всё будет нормально. Увидит только компоновщик, который видит все файлы.
Ничего не понял, короче, можно пример, когда этот способ не сработает.
Вообще, инклуд-guardы хороши, но лучше всяких guardов поможет просто держать в голове, какие файлы есть в проекте. Какие заголовки куда подключаются. И по возможности самому контролировать это, не включая второй раз заголовок, который уже включён внутри одного из заголовков проекта.
Вообще, если есть возможность, то избегать вложенных инклудов внутри h-файлов,

Просто надо держать в голове все *.с файлы, которые их используют данный заголовок и в них обеспечивать подключение заголовков, от которых зависит данный в нужном порядке.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.02.2013, 20:57     Как передать ссылку на объект в класс #17
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Ничего не понял, короче, можно пример, когда этот способ не сработает.
.h файл, в нём определение (функции, переменной и т.п.). Присутствует инклуд-guard. Это файл подключен в нескольких файлах .cpp. Никаой инклуд-guard не спасёт от множественного определения.
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
20.02.2013, 21:00     Как передать ссылку на объект в класс #18
так а нефиг в h-файлах определять переменные и функции. Никогда, даже если один раз инклудится он в проекте.
я о таком даже подумать не мог, когда отвечал на твоё сообщение.
Прототипы функций, объявления структур, классов и объединений, объявление extern переменных, макросы и дефайны - вот что должно быть в h-файле
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.02.2013, 21:18     Как передать ссылку на объект в класс #19
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
я о таком даже подумать не мог, когда отвечал на твоё сообщение.
Ты не мог, а другие спошь и рядом делают. Недавняя тема: поместил методы специализации класса, вместе с шаблонами, в .h файл и подключил его к нескольким .cpp. С шаблонами так и нужно, а специализация давала множественное определение. Надеются на инклуд-guard.

Добавлено через 5 минут
Специализация шаблона
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.02.2013, 16:04     Как передать ссылку на объект в класс
Еще ссылки по теме:

C++ Как в функции my_function преобразовать ссылку на базовый класс в ссылку на класс B или С
C++ Как правильно передать объект fstream в функцию
C++ Как вернуть ссылку на объект?

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

Или воспользуйтесь поиском по форуму:
Helldrg
54 / 54 / 1
Регистрация: 10.01.2011
Сообщений: 1,080
22.02.2013, 16:04  [ТС]     Как передать ссылку на объект в класс #20
Вы имеете ввиду реализацию класса в .сpp делать а прототипы в .h?
Yandex
Объявления
22.02.2013, 16:04     Как передать ссылку на объект в класс
Ответ Создать тему
Опции темы

Текущее время: 19:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru