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

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

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

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

27.10.2012, 17:28. Просмотров 1200. Ответов 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 ===|

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

Как создать отдельную функцию для каждого объекта класса - C++
Ну например есть класс struct Class { void onUpdate (); } Мне надо сделать так, что бы у объекта obj1 типа Class функция...

Создать копию объекта производного класса зная указатель на базовый - C++
Добрый день! Вопрос в следующем... Возможно ли создать копию объекта производного класса зная указатель на базовый класс? У меня получился...

Создать 2 объекта a и b, разработанного класса – символьная строка, реализовать перегрузку операции >= - C++
Нужно написать прогу, сам пытался но не смог. (желательно с обьяснением) Заранее спасибо! Создать 2 объекта a и b, разработанного...

Создать класс. Символьное поле должно быть задано как объект класса string - C++
решите задачку!) 6. Создать класс. Символьное поле должно быть задано как объект класса string. Написать конструктор по умолчанию,...

Не удаётся создать безымянный объект типа vector моего типа - C++
Собсно #include <vector> using namespace std; //Вот мой австорский тип struct kletka { int i, j; kletka(int x, int...

Проверка создания объекта класса BBB из класса AAA и работа с ним - C++
#define @param2; // объявили для выяснения случая: нужен новый или использовать существующий. Class AAA { private: void...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
27.10.2012, 17:38 #2
А что, безымянные переменные других типов вам удаётся создавать?
0
kotleta
42 / 42 / 11
Регистрация: 13.09.2012
Сообщений: 196
27.10.2012, 17:40  [ТС] #3
Проверил на своем классе, действительно нельзя?

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

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

string(str);string (str);string str; Итого получается, что вы хотите в той же области видимости создать одноимённую переменную.
0
Петррр
5954 / 3391 / 337
Регистрация: 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
kotleta
42 / 42 / 11
Регистрация: 13.09.2012
Сообщений: 196
28.10.2012, 09:04  [ТС] #7
string(str); ≡ string (str); ≡ string str; Итого получается, что вы хотите в той же области видимости создать одноимённую переменную.
это вообще не понял

Петррр, а почему работает?
0
Петррр
5954 / 3391 / 337
Регистрация: 28.10.2010
Сообщений: 5,926
28.10.2012, 09:08 #8
kotleta, не знаю.
0
kertio
26 / 26 / 1
Регистрация: 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
kotleta
42 / 42 / 11
Регистрация: 13.09.2012
Сообщений: 196
28.10.2012, 10:53  [ТС] #10
kertio, какой еще адрес?

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

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

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

А безымянный объекта ВООБЩЕ никогда нельзя создавать, или есть случаи где можно?
0
kertio
26 / 26 / 1
Регистрация: 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
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 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
Somebody
2789 / 1603 / 145
Регистрация: 03.12.2007
Сообщений: 4,193
Завершенные тесты: 1
28.10.2012, 15:03 #13
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Хотя сами по себе тоже (в принципе) могут быть полезны, но это если в их конструкторе есть какие-то побочные эффекты, что не совсем хорошо с архитектурной точки зрения.
Ну, допустим, std::lock_guard. Если даже создать небезымянный нагляднее, всё равно обращений по имени к нему не будет.
0
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
28.10.2012, 15:21 #14
Цитата Сообщение от Somebody Посмотреть сообщение
std::lock_guard
lock_guard освобождает мьютекс, когда он выходит за пределы функции(грубо говоря). А безымянный объект не дотянет до конца функции. Так что не покатит вариант.
1
Somebody
2789 / 1603 / 145
Регистрация: 03.12.2007
Сообщений: 4,193
Завершенные тесты: 1
28.10.2012, 15:34 #15
Да, что-то я ступил...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2012, 15:34
Привет! Вот еще темы с ответами:

Объявление объекта класса fstream в качестве статической компоненты другого класса - C++
Доброго времени суток. Есть задание, в котором говорится &quot;...Перепишите программы из упражнений 4 и 6 таким образом, чтобы использовать...

Указатель на объект базового класса и адрес объекта производного класса - C++
Пример кода: class Class1 { public: Class1(int x) { j = new int; *j = x; } ~Class1() {delete j;}

Возможно ли создание объекта шаблонного класса в функции этого класса? - C++
Доброго времени суток, уважаемые форумчане :) Мне по лабам задали задание - реализовать шаблон контейнера (множество) с операциями...

Использование объекта одного класса при создании нового класса - C++
Добрый вечер. У меня такая проблема. Есть готовый класс L2 - список, на его основе нужно создать дек. Я поступил так: в приватной части...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
28.10.2012, 15:34
Ответ Создать тему
Опции темы

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