Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
Helldrg
26 / 55 / 1
Регистрация: 10.01.2011
Сообщений: 1,147
#1

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

20.02.2013, 00:39. Просмотров 2225. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.02.2013, 00:39
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как передать ссылку на объект в класс (C++):

Как в функции my_function преобразовать ссылку на базовый класс в ссылку на класс B или С - C++
Всем привет, как в функции my_function преобразовать ссылку на базовый класс в ссылку на класс B или С ? class A { public: A(); ...

Недопустимый неполный тип , или как передать в функцию указатель на объект класса , или просто объект - C++
Други мои , кодеры. Не могу я ни как передать в функцию объект класса , или что еще лучше(для меня , так как учусь работать с указателями)...

Как вернуть ссылку на объект? - C++
Вот код из книжки А.Крупника "Изучаем С++" char suits = {'','—','','’'}; char cds = {'6','7','8','9','A','‚','„','Š','’'}; ...

Как функции возвратить ссылку на объект? - C++
//Есть некая функция что писать перед функцией??? Инт написал. int func(){ // Создаем какой-то обьект Obj object_1; //что-то с ней...

Как передать ссылку на переменную по UDP? - C++
Все в пределах одного компьютера. Две программы. Одна имеет переменную int r; Вторая должна получить ссылку и считывать в любое...

Как передать в функцию ссылку на структуру? - C++
Добрый вечер, помогите пожалуйста разобраться. Нужно чтобы функция myProc принимала не структуру, а ссылку на структуру.struct vs { long...

29
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
20.02.2013, 00:58 #2
Цитата Сообщение от Helldrg Посмотреть сообщение
ClassA->Function(&Log);
Log и так объявлен как указатель, не надо брать у него адрес
1
Helldrg
26 / 55 / 1
Регистрация: 10.01.2011
Сообщений: 1,147
20.02.2013, 01:02  [ТС] #3
если написать так
C++
1
ClassA->Function(Log);
То напишет: аргумент типа LogClass* несовместим с параметром типа LogClass*
И что делать в этом случае?)
0
alsav22
5435 / 4830 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.02.2013, 01:09 #4
Не видно, что где подключено.
1
Helldrg
26 / 55 / 1
Регистрация: 10.01.2011
Сообщений: 1,147
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*);
};
Типа такого
0
alsav22
5435 / 4830 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.02.2013, 01:28 #6
Где-то лишнее подключение. logclass.h не вижу... Что там?
1
Kuzia domovenok
2125 / 1955 / 194
Регистрация: 25.03.2012
Сообщений: 6,804
Записей в блоге: 1
20.02.2013, 01:31 #7
ссылки тут и близко не используются.
Не стоит путать оператор & и объявление ссылок.

Цитата Сообщение от alsav22 Посмотреть сообщение
Где-то лишнее подключение. logclass.h не вижу... Что там?
в этой строчке
Цитата Сообщение от Helldrg Посмотреть сообщение
main.h
#include "Cclassa.h"
#include "logclass.h"
тут "Cclassa.h" в свою очередь второй раз инклудит логкласс
1
Helldrg
26 / 55 / 1
Регистрация: 10.01.2011
Сообщений: 1,147
20.02.2013, 01:31  [ТС] #8
Цитата Сообщение от alsav22 Посмотреть сообщение
Где-то лишнее подключение. logclass.h не вижу... Что там?
Бывают лишние подключения?) Так то да у меня в двух местах подключается, а как этого избегать?
0
alsav22
5435 / 4830 / 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();
1
Helldrg
26 / 55 / 1
Регистрация: 10.01.2011
Сообщений: 1,147
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.:А такой способ ведения ошибок нормальный или другой можете посоветовать?)
0
alsav22
5435 / 4830 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.02.2013, 01:42 #11
Цитата Сообщение от Helldrg Посмотреть сообщение
но вырубается сразу
В main(), перед return 0; поставьте system("pause");

Добавлено через 3 минуты
Цитата Сообщение от Helldrg Посмотреть сообщение
P.S.:А такой способ ведения ошибок нормальный или другой можете посоветовать?)
Такой - это какой?
0
Helldrg
26 / 55 / 1
Регистрация: 10.01.2011
Сообщений: 1,147
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;
}
У меня такой способ ведения ошибок, подскажите, может есть что нибудь более универсальное))
0
ITcrusader
Эксперт С++
177 / 163 / 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
Тогда даже если ты случайно этот файл дважды включишь в единицу трансляции, он по факту заинклудится один раз
1
Helldrg
26 / 55 / 1
Регистрация: 10.01.2011
Сообщений: 1,147
20.02.2013, 12:30  [ТС] #14
Спасибо большое! Полезная вещь!!!
0
alsav22
5435 / 4830 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.02.2013, 14:51 #15
Это способ применять следует, но это не исключает множественности включений. Это работает для компилятора, который в каждую единицу времени видит одну единицу трансляции, поэтому и сработает, если двойные включения находятся в одном файле. Если же двойные включения в разных файлах, то этот способ уже не поможет, потому что для компилятора всё будет нормально. Увидит только компоновщик, который видит все файлы.
Цитата Сообщение от ITcrusader Посмотреть сообщение
а как этого избегать?
Не помещать реализации (в частности реализации специализаций методов-функций) в .h файлы, только прототипы (исключения для шаблонов). Следить, и компоновщик подскажет.
1
20.02.2013, 14:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.02.2013, 14:51
Привет! Вот еще темы с ответами:

Как передать в метод класса ссылку на экземпляр - C++
Есть класс class Class{ ... } Как передать в метод экземплер класса из которого вызывается этот метод? Пробывал так: class Class{ ...

Как передать объект в функцию - C++
Допустим у меня есть такой класс: class Abc { private: int a; public: void set_a(int A) { a = A;

C++ Как в многопоточность передать объект класса? - C++
Доброго времени суток! Подскажите пожалуйста одну вещь, у меня есть функция внутри класса и мне нужно передать её в мультипоточность. Вот...

Как правильно передать объект fstream в функцию - C++
При использовании следующего подхода возникают вопросы: int myFunc(fstream&amp; data); 1. Если я открою поток из функции, можно ли его...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru