Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
engine76
2 / 2 / 1
Регистрация: 04.03.2014
Сообщений: 65
#1

Функция, принимающая аргументы нескольких типов - C++

15.08.2015, 22:15. Просмотров 379. Ответов 8
Метки нет (Все метки)

Доброго времени суток. Написал скромный класс Log для логирования чего либо в файл, потом мб пригодится... Убрал в статическую библиотеку.
Ниже весь код:

cLog.h
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
#ifndef _CLOG_H_
#define _CLOG_H_
 
#define _CRT_SECURE_NO_WARNINGS
 
#include <ctime>
#include <string>
#include <fstream>
#include <iostream>
 
namespace System_LOG
{
    class cLog
    {
    public:
        void Call(std::string);
 
    private:
        bool Initialize();
        void loggingInFile(std::string);
        std::string GetLogTime();
        void Shutdown();
 
        std::ofstream* pLogFile;
    };
}
 
#endif
cLog.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
#include "cLog.h"
 
//*********************************************************************************************
void System_LOG::cLog::Call(std::string message)
{
    if(Initialize())
    {
        loggingInFile(message);
        Shutdown();
    }
    else
        std::cout << "Error open log-file!\n";
}
//*********************************************************************************************
bool System_LOG::cLog::Initialize()
{
    pLogFile = new std::ofstream("logfile.txt", std::ios::app | std::ofstream::out);
    if(pLogFile->is_open())
        return true;
    else
        return false;
}
//*********************************************************************************************
void System_LOG::cLog::loggingInFile(std::string message)
{
    message = GetLogTime() + message + "\n";
    pLogFile->write(message.c_str(), message.size());
}
//*********************************************************************************************
std::string System_LOG::cLog::GetLogTime()
{
    char buffer[100];
    std::string currentTimeAndDate;
    time_t seconds = time(NULL);
    tm* timeInfo = localtime(&seconds);
    char* format = "[%d-%m-%Y][%H:%M:%S]-> ";
    strftime(buffer, 100, format, timeInfo);
    currentTimeAndDate = buffer;
    return currentTimeAndDate;
}
//*********************************************************************************************
void System_LOG::cLog::Shutdown()
{
    pLogFile->close();
    delete pLogFile;
    pLogFile = nullptr;
}
Хотелось бы узнать, как можно реализовать возможность передачи в Call различных аргументов (например char и std::string). Точнее как идентифицировать тип аргумента и в зависимости от этого выбрать поведение функции. Конечно это легко обойти, переписав под char и при необходимости передачи string писать так
C++
1
pLog->Call(string.c_str());
Интересуюсь больше для общего развития... знания лишними не будут. Заранее благодарю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.08.2015, 22:15
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Функция, принимающая аргументы нескольких типов (C++):

Функция, принимающая двумерный массив
Дело такое: Есть функция, которая в параметрах принимает двумерный массив....

Функция принимающая контейнерный тип
функция должна принять контейнерный шаблонный класс но шаблон определен внутри....

Функция, принимающая в качестве параметра функцию
Навести пример функции, которая в качестве параметра принимает функцию

Виртуальная функция, принимающая объекты поочередно
есть класс у него 2 дочерних, есть статическая функция вызывающая ф-ю вывода на...

Функция принимающая строковое приглашение от вызывающего её кода
С++ функция должна принимать строковое приглашение от вызывающего её кода -...

Шаблонная функция принимающая вектор - что-то не так с итератором
Задачка такая: Написать шаблонную функцию принимающую вектор и суммирующую все...

8
nmcf
6246 / 5558 / 2528
Регистрация: 14.04.2014
Сообщений: 23,369
15.08.2015, 22:17 #2
Сделай несколько Call() под разные параметры.
1
engine76
2 / 2 / 1
Регистрация: 04.03.2014
Сообщений: 65
15.08.2015, 22:59  [ТС] #3
Цитата Сообщение от nmcf Посмотреть сообщение
Сделай несколько Call() под разные параметры.
И как я понимаю будет вызываться нужная функция в зависимости от аргумента?
Такой вариант самый простой думаю
C++
1
2
3
4
5
6
7
8
9
10
11
void System_LOG::cLog::Call(char* message)
{
std::string convertedMessage = message;
    if(Initialize())
    {
        loggingInFile(convertedMessage);
        Shutdown();
    }
    else
        std::cout << "Error open log-file!\n";
}
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
15.08.2015, 23:17 #4
Цитата Сообщение от nmcf Посмотреть сообщение
Сделай несколько Call() под разные параметры.
Или вовсе шаблонную функцию.
engine76, не забывай передавать объекты по константной ссылке, если их не надо менять.
Передача std::string по значению, в данном случае не эффективна.
2
engine76
2 / 2 / 1
Регистрация: 04.03.2014
Сообщений: 65
15.08.2015, 23:40  [ТС] #5
Цитата Сообщение от Tulosba Посмотреть сообщение
Передача std::string по значению, в данном случае не эффективна.
То есть, лучше делать так?
C++
1
pLog->Call(&string);
Это для уменьшения затрат за счет отсутствия копирования строки?
Цитата Сообщение от Tulosba Посмотреть сообщение
не забывай передавать объекты по константной ссылке, если их не надо менять.
Вот с этим слабо знаком, только изучаю язык... Можно поподробнее про константные ссылки, или ссылки на какие либо статьи.

Добавлено через 7 минут
Еще вопрос, не знаю внутреннего устройства работы функций... Передаю по ссылке в Call(&message);
C++
1
2
3
4
5
6
7
8
9
10
void System_LOG::cLog::Call(std::string &message)
{
    if(Initialize())
    {
        loggingInFile(message);//В эту функцию при таком варианте будет передача по ссылке?
        Shutdown();
    }
    else
        std::cout << "Error open log-file!\n";
}
Где хранится строка в момент от вызова функции Call(), до вызова loggingInFile()? Или же аргумент принимается извне Call(), когда выполнение доходит до вызова loggingInFile, что в таком случае передается в loggingInFile
0
nmcf
6246 / 5558 / 2528
Регистрация: 14.04.2014
Сообщений: 23,369
16.08.2015, 08:22 #6
Здесь должно быть без "&":
C++
1
pLog->Call(&string);
Вот так с константной:
C++
1
void System_LOG::cLog::Call(const std::string &message)
Цитата Сообщение от engine76 Посмотреть сообщение
Где хранится строка в момент от вызова функции Call()
Там же, где и до вызова функции.
Цитата Сообщение от engine76 Посмотреть сообщение
что в таком случае передается в loggingInFile
Туда копия пойдёт.
1
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
16.08.2015, 12:02 #7
Цитата Сообщение от engine76 Посмотреть сообщение
То есть, лучше делать так?
При вызове функции запись не меняется. Меняется сигнатура:
C++
1
void System_LOG::cLog::Call(const std::string& message)
Цитата Сообщение от engine76 Посмотреть сообщение
Это для уменьшения затрат за счет отсутствия копирования строки?
Да.
Цитата Сообщение от engine76 Посмотреть сообщение
Можно поподробнее про константные ссылки, или ссылки на какие либо статьи.
Условно представь ссылку как указатель, а константую ссылку, как указатель на константные данные.
В общем, если пока изучаешь язык, читай литературу. В базовой части всё это должен освоить и без помощи форума.
В частности, если оставить ссылку без const, то например следующий вызов не прокатит:
C++
1
Call("some message");
Будет ошибка компиляции.
1
gru74ik
Модератор
Эксперт CЭксперт С++
4648 / 1962 / 293
Регистрация: 20.02.2013
Сообщений: 5,225
Записей в блоге: 23
16.08.2015, 12:35 #8
Цитата Сообщение от Tulosba Посмотреть сообщение
Условно представь ссылку как указатель, а константую ссылку, как указатель на константные данные.
Поддерживаю. Ссылку можно представить себе как указатель, который не надо разыменовывать.

Добавлено через 13 минут
Вот в книге Праты "Язык программирования С++. Лекции и упражнения" (2012, 6-е издание, глава 8, стр. 371):
Цитата Сообщение от Стивен Прата
Язык C++ вводит в практику новый составной тип данных — ссылочную
переменную. Ссылка представляет собой имя, которое является псевдонимом, или
альтернативным именем, для ранее объявленной переменной. Например, если вы делаете
twain ссылкой на переменную clemens, можно взаимозаменяемо использовать эти
имена для представления данной переменной. В чем смысл применения
альтернативного имени? Не в том ли, чтобы помочь-тем программистам, которые не
удовлетворены сделанным ими выбором имен переменных? Вполне возможно, однако, основное
назначение ссылок — их использование в качестве формальных аргументов функций.
Применяя ссылку в качестве аргумента, функция работает с исходными данными, а
не с их копиями. Ссылки представляют собой удобную альтернативу указателям при
обработке крупных структур посредством функций. Они играют важную роль при
создании классов.
1
engine76
2 / 2 / 1
Регистрация: 04.03.2014
Сообщений: 65
17.08.2015, 01:13  [ТС] #9
Благодарю за пояснения. Кстати говоря, именно по этой книге Праты и учу язык, просто не дошел пока до туда. Начинал-то с книги Дейтелов "Как программировать на С++", но уж больно муторно написано, куча тонкостей сразу, во всяком случае для меня. У Праты информация лучше воспринимается..
Где-то я видел подход к обучению примерно такой: имея определенный базис знаний, поставить себе задачу написать какое-либо приложение, и по ходу искать методы решения той или иной подзадачи в проекте... только думаю что можно написать более-менее серьезное в консоли, учить апи или библиотеки для гуи пока в планы не входит.
0
17.08.2015, 01:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.08.2015, 01:13
Привет! Вот еще темы с решениями:

Результатом вычисления фрагмента не является функция, принимающая 2 аргументов
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;math.h&gt; #include...

Результатом вычисления фрагмента не является функция, принимающая 1 аргументов
проверьте пожалуйста ошибку выдает!!!( #include &lt;iostream&gt; #include...

Функция, принимающая указатель на переменную и записывающая в нее значение модуля
Написать функцию, которая принимает указатель на переменную и записывает в нее...

в 8 и 10 строке результатом вычисления фрагмента не является функция принимающая 1 аргументов
#include &quot;stdafx.h&quot; #include &lt;math.h&gt; #include &lt;iostream&gt; #include &lt;iomanip&gt;...


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

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

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