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

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

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

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

27.10.2012, 17:28. Просмотров 1160. Ответов 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
Посмотрите здесь:
C++ Создать копию объекта производного класса зная указатель на базовый
Как создать отдельную функцию для каждого объекта класса C++
Создать 2 объекта a и b, разработанного класса – символьная строка, реализовать перегрузку операции >= C++
Создать класс. Символьное поле должно быть задано как объект класса string C++
C++ Не удаётся создать безымянный объект типа vector моего типа
C++ Проверка создания объекта класса BBB из класса AAA и работа с ним
Объявление объекта класса fstream в качестве статической компоненты другого класса C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
27.10.2012, 17:38     Создать безымянный объекта класса string #2
А что, безымянные переменные других типов вам удаётся создавать?
kotleta
42 / 42 / 11
Регистрация: 13.09.2012
Сообщений: 196
27.10.2012, 17:40  [ТС]     Создать безымянный объекта класса string #3
Проверил на своем классе, действительно нельзя?

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

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

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

Петррр, а почему работает?
Петррр
5946 / 3383 / 336
Регистрация: 28.10.2010
Сообщений: 5,927
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
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
~ Эврика! ~
1243 / 992 / 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
2786 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,190
Завершенные тесты: 1
28.10.2012, 15:03     Создать безымянный объекта класса string #13
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Хотя сами по себе тоже (в принципе) могут быть полезны, но это если в их конструкторе есть какие-то побочные эффекты, что не совсем хорошо с архитектурной точки зрения.
Ну, допустим, std::lock_guard. Если даже создать небезымянный нагляднее, всё равно обращений по имени к нему не будет.
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
28.10.2012, 15:21     Создать безымянный объекта класса string #14
Цитата Сообщение от Somebody Посмотреть сообщение
std::lock_guard
lock_guard освобождает мьютекс, когда он выходит за пределы функции(грубо говоря). А безымянный объект не дотянет до конца функции. Так что не покатит вариант.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2012, 15:34     Создать безымянный объекта класса string
Еще ссылки по теме:
Возможно ли создание объекта шаблонного класса в функции этого класса? C++
Указатель на объект базового класса и адрес объекта производного класса C++
C++ Ошибка компиляции (преобразование объекта класса в объект другого класса)
Использование объекта одного класса при создании нового класса C++
Объявление объекта одного класса в описании другого класса C++

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

Или воспользуйтесь поиском по форуму:
Somebody
2786 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,190
Завершенные тесты: 1
28.10.2012, 15:34     Создать безымянный объекта класса string #15
Да, что-то я ступил...
Yandex
Объявления
28.10.2012, 15:34     Создать безымянный объекта класса string
Ответ Создать тему
Опции темы

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