С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 08.08.2015
Сообщений: 91

Можно ли получить копию объекта по ссылке?

08.08.2015, 17:22. Показов 3002. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Столкнулся со следующей проблемой:

В интерфейсе функции есть такое объявление метода

C++ (Qt)
1
2
3
4
class Logger : public ILogger
{
   virtual void log(const QString &) = 0;
}
Как видно, параметр строки передается по ссылке с оператором const и не может изменяться внутри функции.

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

C++ (Qt)
1
2
3
4
5
6
7
class ConsoleLogger : public ILogger
{
  public:
    void log(const QString &string){
       // std::cout << QString::fromUtf8(string).toUtf8().data() << std::endl;
    }
};
Компилятор ругается на то, что я пытаюсь изменить ссылочное значение. Не хотелось бы изменять интерфейс кастрированием const. И в принципе вообще не хотелось бы затрагивать интерфейс со всеми классами.
Возможно ли получить по ссылке копию объекта и уже внутри сделать преобразование? Если этого не сделать то один костыльный класс тянет много изменений. Изолировать его от интерфейса тоже не хочется.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.08.2015, 17:22
Ответы с готовыми решениями:

Можно ли получить документ по ссылке в поле Richtext?
Можно ли получить документ по ссылке в поле RichText?

Можно ли по самому факту наличия ноутбука с наклейкой винды получить лицензионную копию этой самой винды?
Всем привет, Покупал ноут с предустановленной Win8, со временем она обновилась до Win10. Сейчас по грустным причинам у меня на этом же...

почему нельзя в операторе + возвращать оригинальное значение(по ссылке), а не копию.
Второй час сижу над одним и тем же кодом и не могу понять, что не так. Не могу сообразить почему нельзя в операторе + возвращать...

7
117 / 121 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
08.08.2015, 17:30
kavashige, приветствую на форуме.
Интерфейс наследуют несколько функций
Думаю, вы хотели сказать, классов, хотя подразумевали функции. Наследовать в С++ можно только классы.

Когда пишут const, с точки зрения проектировки значится, что этот объект в данной функции/классе изменятся не должен. Если это так, действительно квалификатор лучше оставить.

В данной реализаций лучше всего создать копию переменной. И если результат надо сохранить в переменной, применить (чего я не хотел бы советовать) операцию const_cast<QString&>(string).
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
08.08.2015, 17:36
C++
1
2
3
4
void log(const QString &string){
       auto copy = string;
       std::cout << QString::fromUtf8(copy ).toUtf8().data() << std::endl;
    }
1
0 / 0 / 0
Регистрация: 08.08.2015
Сообщений: 91
08.08.2015, 17:55  [ТС]
Не знаю, как редактировать...сообщение. Под интерфейсом я имел ввиду(в предыдущем сообщении накопировал из разных мест, ниже вариант правильный, но суть не менялась) класс с виртуальными методами:

C++ (Qt)
1
2
3
4
5
6
7
class ILogger : public QObject
{
    Q_OBJECT
 
  public:
    virtual void log(const QString &) = 0;
};
Как создать копию переменной? Мне это как раз и нужно. Сохранять результат не требуется. Нужно просто преобразовать строку и вывести в консоль. Можно поподробнее? Или более нагляднее.
C++ (Qt)
1
2
3
4
void log(const QString &string){
   QString anotherString = (пример кода); // копия объекта внутри функции
   // const_cast<QString&>(string) как изменить объект? (Для изучения, понимаю что это глупо менять)
}
0
117 / 121 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
08.08.2015, 18:01
kavashige, а что hoggy написал? Немножко удивляет, что с классами и виртуальными функциями знакомы, а с присваиванием нет

Добавлено через 1 минуту
Auto - автоопределение типа на основе операции присваивания, если что. Так что можете QString писать
1
0 / 0 / 0
Регистрация: 08.08.2015
Сообщений: 91
08.08.2015, 18:01  [ТС]
Программирую давненько но auto никогда не использовал, как то обходился без него
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
08.08.2015, 21:58
kavashige, все гораздо проще.
C++
1
2
3
void log(const QString &string){
       std::cout << QString::fromUtf8(string).toUtf8().constData() << std::endl;
}
Вопрос только зачем сперва из Utf-8, затем обратно перегонять?
Если уж на то пошло, то почему не так?
C++
1
2
3
void log(const QString &string){
       qDebug() << string;
}
А про const_cast советую на пару лет забыть.
1
0 / 0 / 0
Регистрация: 08.08.2015
Сообщений: 91
11.08.2015, 07:26  [ТС]
На с чет перегонять из одного типа в другой это вообще отдельная тема, т.к. у меня не выводились нормально кракозябры и прочее это не последний вариант, а так как вы написали возможно, но мне требуется некоторая модификация сообщения в дальнейшем поэтому вот так было в итоге сделано:

C++ (Qt)
1
2
3
4
5
6
7
8
void ConsoleLogger::log(const QString &string)
{
  QMutexLocker locker(&mutex);
  QDateTime t;
  QString str = t.currentDateTime().toString("dd.MM.yyyy hh:mm:ss") + " ";
  str = str + string;
  std::cout << str.toLocal8Bit().data() << std::endl;
}
Спасибо всем за помощь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.08.2015, 07:26
Помогаю со студенческими работами здесь

Как можно получить из объекта Process производительность процесса для ЦП
Как можно получить из объекта Process производительность процесса для ЦП? Или: как имея PID получить производительность процесса? Если...

Можно ли получить текущий класс объекта в статическом методе родительского класса?
Здравствуйте, можно ли получить текущий класс объекта в статическом методе родительского класса?

Можно ли стандартными средствами VBA получить из объекта range его часть
Коллеги, Можно ли стандартными средствами VBA получить из объекта range его часть? Например объект range - это матрица размером 10x10,...

Как сделать копию объекта
Всем привет. Как сделать копию объекта так, чтобы копия могла существовать не зависимо от оригинала? Например как это сделать с...

Как создать копию объекта
Не могу найти ни в документации ни в других местах как можно создать копию (независимую) объекта, а как ссылку на объект метод...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru