Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
44 / 44 / 17
Регистрация: 13.09.2012
Сообщений: 196
1

Создать безымянный объекта класса string

27.10.2012, 17:28. Показов 3549. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
C++
1
2
3
4
void foo(const char* str)
{
 string(str);
}
output:

97|error: declaration of 'std::string str' shadows a parameter|
||=== Build finished: 1 errors, 1 warnings ===|

Не понимаю почему создаю безыменнянный объект класса, что ж он ругается?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.10.2012, 17:28
Ответы с готовыми решениями:

Определить класс Triangle, разработав следующие элементы класса. Поля: - double a, b, c; - string name; //имя объекта
Определить класс Triangle, разработав следующие элементы класса. Поля: - double a, b, c; -...

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

Не могу создать переменную класса string
Всем привет! Проблема такая: создаю новый проект (обычный application), требуется создать...

Создать событие для объекта класса
Доброго времени суток! Предположим, что существует класс, назовём его MyClass. Я добавляю в список...

17
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
27.10.2012, 17:38 2
А что, безымянные переменные других типов вам удаётся создавать?
0
44 / 44 / 17
Регистрация: 13.09.2012
Сообщений: 196
27.10.2012, 17:40  [ТС] 3
Проверил на своем классе, действительно нельзя?

А почему так было сделано?
Почему запрещено?
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
27.10.2012, 17:43 4
Цитата Сообщение от kotleta Посмотреть сообщение
А почему так было сделано?
Почему запрещено?
Х.з. Странно вообще. Вроде и вещь такая полезная.
0
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
27.10.2012, 17:44 5
Я просто не понимаю, накой это делать. Тем более, что это не переменная, а временный объект. Который ещё и не используется.

А вообще enjoy your C++. Вы напоролись на одни из граблей его контекстно-зависимого синтаксиса.

string(str);string (str);string str; Итого получается, что вы хотите в той же области видимости создать одноимённую переменную.
0
6280 / 3565 / 898
Регистрация: 28.10.2010
Сообщений: 5,926
27.10.2012, 17:54 6
C++
1
2
3
4
void foo(const char *str)
{
    (std::string(str));
}
1
44 / 44 / 17
Регистрация: 13.09.2012
Сообщений: 196
28.10.2012, 09:04  [ТС] 7
string(str); ≡ string (str); ≡ string str; Итого получается, что вы хотите в той же области видимости создать одноимённую переменную.
это вообще не понял

Петррр, а почему работает?
0
6280 / 3565 / 898
Регистрация: 28.10.2010
Сообщений: 5,926
28.10.2012, 09:08 8
kotleta, не знаю.
0
26 / 26 / 3
Регистрация: 20.09.2011
Сообщений: 68
28.10.2012, 10:04 9
[QUOTE=kotleta;3617269]
C++
1
2
3
4
5
void foo(const char* str)
{
 //string(str);  тут ты конструируешь новый объект. и адрес созданного объкта никому не присваивается.
  (void)string(str); // если не хочешь никуда присваивать адрес то приведи к типу void
}
1
44 / 44 / 17
Регистрация: 13.09.2012
Сообщений: 196
28.10.2012, 10:53  [ТС] 10
kertio, какой еще адрес?

нельзя присваивать адрес конструктора

Добавлено через 3 минуты
неправильно написал
C++
1
kertio
, а почему?

Добавлено через 5 минут
~OhMyGodSoLong~

А безымянный объекта ВООБЩЕ никогда нельзя создавать, или есть случаи где можно?
0
26 / 26 / 3
Регистрация: 20.09.2011
Сообщений: 68
28.10.2012, 11:22 11
Цитата Сообщение от kotleta Посмотреть сообщение
kertio, какой еще адрес?

нельзя присваивать адрес конструктора

Добавлено через 3 минуты
неправильно написал
C++
1
kertio
, а почему?

Добавлено через 5 минут
~OhMyGodSoLong~

А безымянный объекта ВООБЩЕ никогда нельзя создавать, или есть случаи где можно?

а что я сделал в строке (void)stding(str)? создал безымянный объект к которому ты не сможешь обратиться. в данному случае в этой операции нет смысла. временный или безымянный объект ты можешь например передать в функцию:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
class Test { };
 
void f(Test *);
 
int main() {
   f(new Test());
 
   return 0;
}
 
void f(Test *t) {
    // Сделать что-то с t
}
P.S.
Про врисваивание адреса конструктора там и слова нигде нет. а вот адрес созданного объекта - это уже другое.
1
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
28.10.2012, 13:19 12
Цитата Сообщение от kotleta Посмотреть сообщение
А безымянный объекта ВООБЩЕ никогда нельзя создавать, или есть случаи где можно?
Не, просто для string это как-то бессмысленно. Вон уже сказали один вариант: временный объект для передачи в функцию. Ещё варианты: всякие цепочки вызовов через точечку вроде vector = filter(vector, f_filter().in(10, 50).mod(3, 0)) и т. д.

Они много где создаются. Но всегда в составе какого-то выражения, а не сами по себе. Хотя сами по себе тоже (в принципе) могут быть полезны, но это если в их конструкторе есть какие-то побочные эффекты, что не совсем хорошо с архитектурной точки зрения.
1
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
28.10.2012, 15:03 13
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Хотя сами по себе тоже (в принципе) могут быть полезны, но это если в их конструкторе есть какие-то побочные эффекты, что не совсем хорошо с архитектурной точки зрения.
Ну, допустим, std::lock_guard. Если даже создать небезымянный нагляднее, всё равно обращений по имени к нему не будет.
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
28.10.2012, 15:21 14
Цитата Сообщение от Somebody Посмотреть сообщение
std::lock_guard
lock_guard освобождает мьютекс, когда он выходит за пределы функции(грубо говоря). А безымянный объект не дотянет до конца функции. Так что не покатит вариант.
1
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
28.10.2012, 15:34 15
Да, что-то я ступил...
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
28.10.2012, 15:56 16
Цитата Сообщение от soon Посмотреть сообщение
А безымянный объект не дотянет до конца функции.
Ну смотря как объект создавался. Ведь оператором new тоже создаются по сути безымянные объекты.
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
28.10.2012, 16:08 17
Toshkarik, я говорил про стек. Но, конечно, мы можем сделать через new
C++
1
std::unique_ptr<std::lock_guard<std::mutex>> ptr(new std::lock_guard<std::mutex>(mutex));
Несколько более монстроузно, не находите?
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
28.10.2012, 16:11 18
Цитата Сообщение от soon Посмотреть сообщение
Несколько более монстроузно, не находите?
Еще бы Это я, так, в качестве примера.
0
28.10.2012, 16:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.10.2012, 16:11
Помогаю со студенческими работами здесь

VB6 Создать событие для объекта класса
Как сделать так, чтобы при достижении переменной где то в коде определенного значения, это...

Создать приложение «Изменение свойств объекта класса»
Создать приложение «Изменение свойств объекта класса». Создать интерфейс, который уведомляет...

Как создать копию объекта любого класса?
Set MyObj = AnyObj присваивает MyObj ссылку на объект AnyObj. Как скопировать объект целиком ?...

String, как создать глобальный массив из экземпляров этого класса?
Добрый день. Начал недавно изучать Visual Studio. Хочу создать в класс одним из полей которого...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru