Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
kotleta
 Аватар для kotleta
42 / 42 / 11
Регистрация: 13.09.2012
Сообщений: 196
#1

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

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

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 ===|

Не понимаю почему создаю безыменнянный объект класса, что ж он ругается?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.10.2012, 17:28     Создать безымянный объекта класса string
Посмотрите здесь:

Модификация объекта string через ссылку и указатель C++
C++ Не удаётся создать безымянный объект типа vector моего типа
C++ Создать копию объекта производного класса зная указатель на базовый
C++ Передача объекта методу другого объекта другого класса
В строке первого объекта класса слово MAX длины заменить на слово MAX длины второго объекта класса C++
Создать 2 объекта a и b, разработанного класса – символьная строка, реализовать перегрузку операции >= C++
Безымянный аргумент функции C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1240 / 989 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
27.10.2012, 17:38     Создать безымянный объекта класса string #2
А что, безымянные переменные других типов вам удаётся создавать?
kotleta
 Аватар для kotleta
42 / 42 / 11
Регистрация: 13.09.2012
Сообщений: 196
27.10.2012, 17:40  [ТС]     Создать безымянный объекта класса string #3
Проверил на своем классе, действительно нельзя?

А почему так было сделано?
Почему запрещено?
castaway
Эксперт С++
4869 / 3008 / 370
Регистрация: 10.11.2010
Сообщений: 11,059
Записей в блоге: 10
Завершенные тесты: 1
27.10.2012, 17:43     Создать безымянный объекта класса string #4
Цитата Сообщение от kotleta Посмотреть сообщение
А почему так было сделано?
Почему запрещено?
Х.з. Странно вообще. Вроде и вещь такая полезная.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1240 / 989 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
27.10.2012, 17:44     Создать безымянный объекта класса string #5
Я просто не понимаю, накой это делать. Тем более, что это не переменная, а временный объект. Который ещё и не используется.

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

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

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

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

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

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

А безымянный объекта ВООБЩЕ никогда нельзя создавать, или есть случаи где можно?
kertio
26 / 26 / 1
Регистрация: 20.09.2011
Сообщений: 68
28.10.2012, 11:22     Создать безымянный объекта класса string #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.
Про врисваивание адреса конструктора там и слова нигде нет. а вот адрес созданного объекта - это уже другое.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1240 / 989 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
28.10.2012, 13:19     Создать безымянный объекта класса string #12
Цитата Сообщение от kotleta Посмотреть сообщение
А безымянный объекта ВООБЩЕ никогда нельзя создавать, или есть случаи где можно?
Не, просто для string это как-то бессмысленно. Вон уже сказали один вариант: временный объект для передачи в функцию. Ещё варианты: всякие цепочки вызовов через точечку вроде vector = filter(vector, f_filter().in(10, 50).mod(3, 0)) и т. д.

Они много где создаются. Но всегда в составе какого-то выражения, а не сами по себе. Хотя сами по себе тоже (в принципе) могут быть полезны, но это если в их конструкторе есть какие-то побочные эффекты, что не совсем хорошо с архитектурной точки зрения.
Somebody
2775 / 1589 / 142
Регистрация: 03.12.2007
Сообщений: 4,162
Завершенные тесты: 1
28.10.2012, 15:03     Создать безымянный объекта класса string #13
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Хотя сами по себе тоже (в принципе) могут быть полезны, но это если в их конструкторе есть какие-то побочные эффекты, что не совсем хорошо с архитектурной точки зрения.
Ну, допустим, std::lock_guard. Если даже создать небезымянный нагляднее, всё равно обращений по имени к нему не будет.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
28.10.2012, 15:21     Создать безымянный объекта класса string #14
Цитата Сообщение от Somebody Посмотреть сообщение
std::lock_guard
lock_guard освобождает мьютекс, когда он выходит за пределы функции(грубо говоря). А безымянный объект не дотянет до конца функции. Так что не покатит вариант.
Somebody
2775 / 1589 / 142
Регистрация: 03.12.2007
Сообщений: 4,162
Завершенные тесты: 1
28.10.2012, 15:34     Создать безымянный объекта класса string #15
Да, что-то я ступил...
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
28.10.2012, 15:56     Создать безымянный объекта класса string #16
Цитата Сообщение от soon Посмотреть сообщение
А безымянный объект не дотянет до конца функции.
Ну смотря как объект создавался. Ведь оператором new тоже создаются по сути безымянные объекты.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
28.10.2012, 16:08     Создать безымянный объекта класса string #17
Toshkarik, я говорил про стек. Но, конечно, мы можем сделать через new
C++
1
std::unique_ptr<std::lock_guard<std::mutex>> ptr(new std::lock_guard<std::mutex>(mutex));
Несколько более монстроузно, не находите?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2012, 16:11     Создать безымянный объекта класса string
Еще ссылки по теме:

Как создать отдельную функцию для каждого объекта класса C++
Создать класс. Символьное поле должно быть задано как объект класса string C++
C++ Создать экземпляр класса без явного указания членов класса
Создать для класса виртуальный метод, возвращающий уникальный идентификатор класса C++
C++ Проверка создания объекта класса BBB из класса AAA и работа с ним

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

Или воспользуйтесь поиском по форуму:
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
28.10.2012, 16:11     Создать безымянный объекта класса string #18
Цитата Сообщение от soon Посмотреть сообщение
Несколько более монстроузно, не находите?
Еще бы Это я, так, в качестве примера.
Yandex
Объявления
28.10.2012, 16:11     Создать безымянный объекта класса string
Ответ Создать тему
Опции темы

Текущее время: 10:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru