Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550

Автоматическое преобразование стандартных типов

13.02.2010, 00:39. Показов 4313. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Если моя функция LOG принимает qString* можно ли сделать так чтобы автоматически вызывалась конструирование временного объекта и он отправлялся в фунцию? т.е. вместо
C++
1
LOG(&qString("Привет мир"));
просто
C++
1
LOG("Привет мир");
Объявление LOG такое:
C++
1
void LOG(qString* Error, ...);
Мне нужно заявить как то компилятору что бы он мог преобразовывать из const char* в qString ? Что должна делать эта функция? Как быть? Впервые сталкиваюсь с таким
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.02.2010, 00:39
Ответы с готовыми решениями:

Запретить классу автоматическое преобразование
Здраствуйте, появились некоторые вопросы. Вообщем надо было создать класс myTime, который будет содержать информацию о времени (часы,...

Автоматическое преобразование китайского кода в нормальный
У меня есть огромный шмат кода примерно такого вида: if (x < 10 && y > 0 && z != 0) return 1; if (x < 10 && (y > 0 ||...

Не происходит неявное преобразование типов ( дочернего класса к базовому)
Если класс Base, от которого наследуются классы Vector и Matrix. у класса Matrix перегружен конструктор копирования, получающий...

26
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
13.02.2010, 01:58
Мне нужно заявить как то компилятору что бы он мог преобразовывать из const char* в qString ? Что должна делать эта функция? Как быть? Впервые сталкиваюсь с таким
Конструктор qString(const char*); добавь..
Объявление LOG такое:
Плохое объявление.. так напиши -> void LOG(qString &Error, ...);

И Чем тебе не угодил стандартный класс std::string
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include <string>
 
void foo(const std::string &rhs){/*....*/}
int main(){
 
    foo("Hello...");
    return 0;
}
http://codepad.org/wtJfPh27
0
 Аватар для Зоти Сергей
230 / 227 / 65
Регистрация: 18.12.2009
Сообщений: 316
13.02.2010, 03:55
Цитата Сообщение от ISergey Посмотреть сообщение
И Чем тебе не угодил стандартный класс std::string
Я так понял, что ф-цию LOG создавал не автор, и возможности ее изменить нет.. Иначе, вопроса, наверное, не было...

в данном случае можно было бы перегрузить данную ф-цию.
зделать из нее
void LOG(char * error, ....)
только вопрос в том, как теперь передать в нее переменное кол-во аргументов.
Можно попробовать так:
C++
1
2
3
4
5
6
7
8
void LOG(char * error, ...)
{
    va_list argptr;
        unsigned long *p;
    va_start(argptr, error);
        p = (unsigned long *)argptr;
    LOG((qString*)error,p[0],p[1],p[2],p[3]);
}
Только вот с количеством аргументов сложно как то...
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
13.02.2010, 12:14
Цитата Сообщение от insideone Посмотреть сообщение
Если моя функция LOG принимает qString* можно ли сделать так чтобы автоматически вызывалась конструирование временного объекта и он отправлялся в фунцию?
В два счета.
1. У qString должен быть конструктор, позволяющий создать объект этого типа из аргумента типа const char* : qString::qString(const char* _arg) { /* как-то конструируем объект...*/ }
2. Функция LOG должна принимать аргумент типа qString по ссылке на константу: LOG(const qString& _arg) { /* здесь как-то логируем этот _arg */ };
Все. После этого можешь смело писать LOG("тра-ля-ля");
1
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
13.02.2010, 12:56  [ТС]
Цитата Сообщение от ISergey Посмотреть сообщение
Плохое объявление.. так напиши -> void LOG(qString &Error, ...);
Цитата Сообщение от CheshireCat Посмотреть сообщение
2. Функция LOG должна принимать аргумент типа qString по ссылке на константу: LOG(const qString& _arg) { /* здесь как-то логируем этот _arg */ };
>error C2664: LOG: невозможно преобразовать параметр 1 из 'const char [42]' в 'const qString &'
> Причина: невозможно преобразовать 'const char [42]' в 'const qString'
> Исходный или конечный объект имеет неполный тип
Цитата Сообщение от ISergey Посмотреть сообщение
И Чем тебе не угодил стандартный класс std::string
для саморазвития полезно
Цитата Сообщение от Зоти Сергей Посмотреть сообщение
Я так понял, что ф-цию LOG создавал не автор, и возможности ее изменить нет.. Иначе, вопроса, наверное, не было...
К сожалению я, наверно переделаю её под прием (const char* , ...) раз так никак...
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
13.02.2010, 13:08
Совет Используй массивы.

void LOG(qString* Error, ...);
Это же указатель на объект каким боком ты адрес строки char сможешь присвоить.
Если бы было так:
void LOG(qString Error, ...); //может бы и прокатило, если у qString есть соответствующий конструктор преобразования.
Но мое предложение не выгодно так как при передаче по значению происходит копирование.
Может есть другие варианты.
0
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
13.02.2010, 13:14
Цитата Сообщение от insideone Посмотреть сообщение
>error C2664: LOG: невозможно преобразовать параметр 1 из 'const char [42]' в 'const qString &'
> Причина: невозможно преобразовать 'const char [42]' в 'const qString'
> Исходный или конечный объект имеет неполный тип
Вот мелкий пример..
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
#include <iostream>
 
class xstr{
public:
    xstr():_str(0), _size(0) { }
    xstr(const char *rhs):_str(0), _size(0){
 
        if(rhs){
            _size = strlen(rhs);
            _str  = new char[_size + 1];
            strcpy(_str, rhs);
        }   
    }
 
    xstr(const xstr&):_str(0), _size(0) { /*......*/ }
 
    xstr &operator = (const xstr&)      { /*......*/ return *this; }
 
    ~xstr(){ delete[] _str; }
 
    const char* c_str() const { return _str; }
private:
    char *_str;
    unsigned _size;
};
 
void foo(const xstr& str){ std::cout << str.c_str() << std::endl; }
 
int main(){
 
    foo("Hello");
    foo("Insideone");
 
    return 0;
}
1
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
13.02.2010, 13:30  [ТС]
Цитата Сообщение от ISergey Посмотреть сообщение
Вот мелкий пример..
Да, все отлично работает.. но... у меня вроде все то же, но... ошибки
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    class qString {
    private:
        char* _data;
        size_t _size;
 
        void _new (const char* newData = NULL);
        void _del();
    public:
    // СОЗДАНИЕ И УДАЛЕНИЕ
        qString(qString& newData);
        qString(int newData);
        qString(const char* newData = NULL);
        ~qString();
/* etc */
Добавлено через 5 минут
Прошу прощения, кажется ошибка была в объявлении, как всегда забываю в одном из двух мест исправить, но как получить следующий параметр const qString в LOG? Ссылки же инициализируются только на 1 объект
0
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
13.02.2010, 13:48
Прошу прощения, кажется ошибка была в объявлении, как всегда забываю в одном из двух мест исправить, но как получить следующий параметр const qString в LOG? Ссылки же инициализируются только на 1 объект
Суть задачи немного уточни.. чтобы понять для чего тебе это нужно.
0
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
13.02.2010, 13:51  [ТС]
LOG принимает сколько угодно параметров чтобы все их записать в файл, иногда надо передавать цифры (qString(int newData);) иногда строки (qString(const char* newData);)
0
depict1
 Аватар для zim22
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
13.02.2010, 14:04
insideone, boost format
?
0
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
13.02.2010, 15:04  [ТС]
2 zim22 уж лучше будут принимать в LOG const char*, ...
0
depict1
 Аватар для zim22
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
13.02.2010, 15:10
insideone, почитай
http://jia3ep.blogspot.com/200... ormat.html
0
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
13.02.2010, 15:14  [ТС]
Хм? Мне не нужно форматировать вывод. У меня есть функция лога
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void LOG(const char* Error, ...)
{
    SYSTEMTIME st;
    GetLocalTime(&st);
    std::fstream LogFile;
    LogFile.open("logfile.txt",std::ios::app);
    if (!LogFile) return;
    LogFile << "[" << st.wDay << "." << st.wMonth << "." << st.wYear << " - " << st.wHour << ":" << st.wMinute << ":" << st.wSecond << "]\n";
    do {
        LogFile << Error;
        Error += (strlen(Error) + 1);
    } while ( Error[0] != NULL ); // если текущая строка пуста - конец
    LogFile << "\n";
LogFile.close();
}
Но хотелось бы чтобы она принимала не только строки. Сейчас это решается тем что я пишу так:
C++
1
LOG("Сообщение", qString(20), "\0");
qString имеет преобразование в const char* поэтому все работает, но хотелось бы принимать сразу qString чтобы писать так
C++
1
LOG("Сообщение", 20, "\0");
0
depict1
 Аватар для zim22
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
13.02.2010, 15:18
Цитата Сообщение от insideone Посмотреть сообщение
Но хотелось бы чтобы она принимала не только строки.
а что ты хочешь ей передавать помимо строк?
0
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
13.02.2010, 15:23  [ТС]
Э... я имею ввиду что получать то она должа только строки, но писать я могу так:
C++
1
LOG("Сообщение", 20, "\0");
20 - это же не строка, но т.к. у qString есть конструктор из int он может сделать это преобразование сам
0
depict1
 Аватар для zim22
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
13.02.2010, 15:25
Цитата Сообщение от insideone Посмотреть сообщение
Э... я имею ввиду что получать то она должа только строки
boost format library - то, что доктор прописал
1
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
13.02.2010, 16:46
Нет, boost format - это, пожалуй, из пушки по воробьям....
Если у insideone такая возможность имеется, я бы предложил изменить интерфейс LOG таким образом, чтобы (этот объект) принимал "оператором сдвига" в стиле C++ :
C++
1
LOG << "Возникла ошибка, код " << errorCode << ", дополнительная информация: " << strDopInfo;
1
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
13.02.2010, 17:31  [ТС]
У меня была такая мысль, однако придется делать его глобальным? Он используется повсеметсно а делать член-указатель во всех объектах чокнешься... или в данном случае глобал - нормальное решение?
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
13.02.2010, 17:57
Читай про паттерн "синглтон" (Singleton) - это то, что тебе нужно. Будет примерно так:
C++
1
myLog::Instance() << "тестовое сообщение";
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.02.2010, 17:57
Помогаю со студенческими работами здесь

Преобразование типов
Ребята помогите разобраться с проблемой вот строка кода TrayIcon-&gt;Handle = LoadImage(HInstance,L&quot;MY_ICON&quot;,RT_ICON,0,0,0);...

Преобразование типов переменных
Доброго вечера. Можете показать при пример преобразования переменной TString в AnsiString Добавлено через 8 минут Что я не...

Преобразование типов в XE2
При компиляции проектов (работают в Builder C++ 6 в BDS 2006) в среде XE2 - возникают новые ошибки, в частности вида: Cannot convert...

Определение и использование функций для обработки стандартных типов данных
Заданы три числа. Отрицательные числа заменить абсолютными значениям, нулевые значения – единицами, положительные – увеличить в два раза.

Преобразование типов из Object.
Подскажите пожалуйста - как преобразовать из Object в UdpClient; Вот есть такая процедурка в нее передаю и в ней нужно произвести...


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

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

Новые блоги и статьи
Реализация операторов Kubernetes
Mr. Docker 16.05.2025
Концепция операторов Kubernetes зародилась в недрах компании CoreOS (позже купленной Red Hat), когда команда инженеров искала способ автоматизировать управление распределёнными базами данных в. . .
Отражение в C# и динамическое управление типами
stackOverflow 16.05.2025
Reflection API в . NET — это набор классов и интерфейсов в пространстве имён System. Reflection, который позволяет исследовать и манипулировать типами, методами, свойствами и другими элементами. . .
Настройка гиперпараметров с помощью Grid Search и Random Search в Python
AI_Generated 15.05.2025
В машинном обучении существует фундаментальное разделение между параметрами и гиперпараметрами моделей. Если параметры – это те величины, которые алгоритм "изучает" непосредственно из данных (веса. . .
Сериализация и десериализация данных на Python
py-thonny 15.05.2025
Сериализация — это своего рода "замораживание" объектов. Вы берёте живой, динамический объект из памяти и превращаете его в статичную строку или поток байтов. А десериализация выполняет обратный. . .
Чем асинхронная логика (схемотехника) лучше тактируемой, как я думаю, что помимо энергоэффективности - ещё и безопасность.
Hrethgir 14.05.2025
Помимо огромного плюса в энергоэффективности, асинхронная логика - тотальный контроль над каждым совершённым тактом, а значит - безусловная безопасность, где безконтрольно не совершится ни одного. . .
Многопоточные приложения на C++
bytestream 14.05.2025
C++ всегда был языком, тесно работающим с железом, и потому особеннно эффективным для многопоточного программирования. Стандарт C++11 произвёл революцию, добавив в язык нативную поддержку потоков,. . .
Stack, Queue и Hashtable в C#
UnmanagedCoder 14.05.2025
Каждый опытный разработчик наверняка сталкивался с ситуацией, когда невинный на первый взгляд List<T> превращался в узкое горлышко всего приложения. Причина проста: универсальность – это прекрасно,. . .
Как использовать OAuth2 со Spring Security в Java
Javaican 14.05.2025
Протокол OAuth2 часто путают с механизмами аутентификации, хотя по сути это протокол авторизации. Представьте, что вместо передачи ключей от всего дома вашему другу, который пришёл полить цветы, вы. . .
Анализ текста на Python с NLTK и Spacy
AI_Generated 14.05.2025
NLTK, старожил в мире обработки естественного языка на Python, содержит богатейшую коллекцию алгоритмов и готовых моделей. Эта библиотека отлично подходит для образовательных целей и. . .
Реализация DI в PHP
Jason-Webb 13.05.2025
Когда я начинал писать свой первый крупный PHP-проект, моя архитектура напоминала запутаный клубок спагетти. Классы создавали другие классы внутри себя, зависимости жостко прописывались в коде, а о. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru