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

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

Войти
Регистрация
Восстановить пароль
 
Александр Макед
0 / 0 / 0
Регистрация: 23.03.2013
Сообщений: 22
#1

констанстность auto_ptr - C++

12.07.2013, 15:57. Просмотров 505. Ответов 12
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
auto_ptr<Nod>/*Nod**/  m_pRoot;
    
    void Insert1(auto_ptr<Nod>/*Nod**/ pRoot, int iValue){
        if(m_pRoot.get() == 0)
            m_pRoot.get() = (new Nod(iValue));/////////////////expression most be a modifible lvalue.
        else if(iValue < pRoot->Value){
            if(pRoot->P1Left.get() == 0)
                pRoot->P1Left.get() = (new Nod(iValue));///////////////expression most be a modifible lvalue.
            else 
                Insert1(pRoot->P1Left, iValue);
        }
        else if(iValue > pRoot->Value){
            if(pRoot->P2Right.get() == 0)
                pRoot->P2Right = (new Nod(iValue));/////////////expression most be a modifible lvalue.
            else 
                Insert1(pRoot->P2Right, iValue);
        }
    }
не понимаю что он хочет, пишет везде где я пытаюсь проинициализировать pRoot->P1Left.get() = (new Nod(iValue)) что expression most be a modifible lvalue.
что не так?
как проинициализировать поля?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.07.2013, 15:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос констанстность auto_ptr (C++):

Auto_ptr - C++
Есть пару простых классов , раньше использовал простые указатели сейчас решил воспользоватся auto_ptr. В классе Duck есть : ...

Класс auto_ptr - C++
Добрый день. Вот мой вариант реализации: template&lt;class T&gt; class Auto_ptr { public: Auto_ptr(T* p) : pointer(p) { } ...

Передача auto_ptr по ссылке - C++
Передача auto_ptr по ссылке противоречит концепции владения. Нельзя быть полностью уверенным в том, что функция, получающая auto_ptr по...

Auto_ptr для хэндлов - C++
Необходимо придумать инструмент для работы с хэндлами файлов (аналог auto_ptr). Может кто-то что-то подобное уже делал?

Отличие get() и release() у auto_ptr - C++
Вопрос,конечно,глупой. Но не могу разобраться. В чём всё таки различение между auto_ptr&lt;int&gt; pi(new int(24)); cout&lt;&lt;pi.release();...

Как использовать auto_ptr? - C++
Ищу, ищу, но нигде не могу найти на русском, да и на буржуйском, толковое описание использования auto_ptr. Везде только какие-то...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ilot
Модератор
Эксперт С++
1809 / 1166 / 227
Регистрация: 16.05.2013
Сообщений: 3,074
Записей в блоге: 5
Завершенные тесты: 1
12.07.2013, 16:05 #2
не понимаю что он хочет, пишет везде где я пытаюсь проинициализировать pRoot->P1Left.get() = (new Nod(iValue)) что expression most be a modifible lvalue.
что не так?
Память выделяется для объекта, а не для его методов и полей.
как проинициализировать поля?
Оператор new создает объект во время исполнения программы. Как вы собираетесь его инициализировать если его нет? Присвоить значение - пожайлуста.
тип указатель = new тип (коструктор)
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
12.07.2013, 16:05 #3
new Nod(iValue) это не lvalue это константа. оператор new возвращает адрес некий памяти, где он разместил массив.
Таким образом все эти выражения с ошибками могут быть эквивалентны
C++
1
2
m_pRoot.get() = 123;//допустим некий адрес 123
m_pRoot.get() = 456;//допустим некий адрес 456
Так вот ошибка в том, что эти значения Rvalue! Они могут стоять справа от оператора =, а слева не могут!
C++
1
2
i=123; j=456;//так можно писать!
123=i; 456=j;//а так нельзя!!
аналогично нельзя писать
C++
1
new Nod=1234;//бессмыслица и ошибка!
ForEveR
В астрале
Эксперт С++
7971 / 4733 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
12.07.2013, 16:28 #4
Функция get константна.
Функция get возвращает rvalue, мы не можем присвоить ничего к rvalue.
Максимум что можно - сохранить указатель во временную переменную, но толку от этого чуть. Юзайте http://en.cppreference.com/w/cpp/memory/auto_ptr/reset (а лучше вообще не юзать auto_ptr).
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
12.07.2013, 16:36 #5
Цитата Сообщение от ForEveR Посмотреть сообщение
Функция get константна.
а какая разница, константна или нет? константные функции можно вызывать у константных объектов, вроде это и есть вся их суть.
Проблема в том, что присвоение значения какому-либо "вызову" Си-функции просто-напросто противоречит нормам языка Си.

Отвлечёмся от классов и указателей на миг. Просто нельзя так писать:
C++
1
2
3
4
5
6
7
8
int get(){
 return 123;
}
int main(){
  get()=456;// Это вообще бред в языке Си
// у него случай аналогичный. Просто вместо 456 стоит значение, возвращаемое new
  return 0;
}
Бред, ибо нету lvalue
Исключение, естесственно, это функции и методы, возвращающие ссылку. Но это же не наш случай!
ForEveR
В астрале
Эксперт С++
7971 / 4733 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
12.07.2013, 16:38 #6
Kuzia domovenok, Да, гоню я конечно.
Александр Макед
0 / 0 / 0
Регистрация: 23.03.2013
Сообщений: 22
12.07.2013, 16:50  [ТС] #7
с .get() это ясно, но в auto_ptr это обычный указатель, я думал что его можно та проинициализировать.
ForEveR
В астрале
Эксперт С++
7971 / 4733 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
12.07.2013, 16:51 #8
Александр Макед, Можно. Через конструктор. Через reset.
Александр Макед
0 / 0 / 0
Регистрация: 23.03.2013
Сообщений: 22
12.07.2013, 16:52  [ТС] #9
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
а какая разница, константна или нет? константные функции можно вызывать у константных объектов, вроде это и есть вся их суть.
Проблема в том, что присвоение значения какому-либо "вызову" Си-функции просто-напросто противоречит нормам языка Си.

Отвлечёмся от классов и указателей на миг. Просто нельзя так писать:
C++
1
2
3
4
5
6
7
8
int get(){
 return 123;
}
int main(){
  get()=456;// Это вообще бред в языке Си
// у него случай аналогичный. Просто вместо 456 стоит значение, возвращаемое new
  return 0;
}
Бред, ибо нету lvalue
Исключение, естесственно, это функции и методы, возвращающие ссылку. Но это же не наш случай!
но в авто_птр ето просто указатель, я думал что его так можно проинициализировать.
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
12.07.2013, 16:59 #10
Инициализировать/присваивать значение как-то так. Есть геттеры. А есть сеттеры. Не надо их путать.
C++
1
2
3
4
5
6
7
auto_ptr<Nod>/*Nod**/  m_pRoot;
    
    void Insert1(auto_ptr<Nod>/*Nod**/ pRoot, int iValue){
        if(m_pRoot.get() == 0)
            m_pRoot.reset (new Nod(iValue));
       
    }
И ещё, кстати наверное правильнее будет принимать ссылку!
C++
1
 void Insert1(auto_ptr<Nod>/*Nod**/ &pRoot
Но я не уверен. Я сам только что узнал про auto_ptr
Александр Макед
0 / 0 / 0
Регистрация: 23.03.2013
Сообщений: 22
12.07.2013, 17:01  [ТС] #11
Цитата Сообщение от ForEveR Посмотреть сообщение
Александр Макед, Можно. Через конструктор. Через reset.
а примерчик можно? =)
а то я что то не пойму как...
ForEveR
В астрале
Эксперт С++
7971 / 4733 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
12.07.2013, 17:03 #12
Александр Макед, А вы не пробовали прежде чем юзать почитать документацию на auto_ptr? Это очень специфичный smart-pointer, поэтому доку в любом случае читать придется.

Конструктор:

C++
1
std::auto_ptr<int> p(new int(1));
Reset:

C++
1
2
std::auto_ptr<int> p(new int(1));
p.reset(new int(2));
Александр Макед
0 / 0 / 0
Регистрация: 23.03.2013
Сообщений: 22
12.07.2013, 17:07  [ТС] #13
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Инициализировать/присваивать значение как-то так. Есть геттеры. А есть сеттеры. Не надо их путать.
C++
1
2
3
4
5
6
7
auto_ptr<Nod>/*Nod**/  m_pRoot;
    
    void Insert1(auto_ptr<Nod>/*Nod**/ pRoot, int iValue){
        if(m_pRoot.get() == 0)
            m_pRoot.reset (new Nod(iValue));
       
    }
И ещё, кстати наверное правильнее будет принимать ссылку!
C++
1
 void Insert1(auto_ptr<Nod>/*Nod**/ &pRoot
Но я не уверен. Я сам только что узнал про auto_ptr
спасибо, помог, теперь буду логику лечить =)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.07.2013, 17:07
Привет! Вот еще темы с ответами:

Сократить объявление auto_ptr для вновь создаваемого объекта - C++
Кстати, может кто подскажет... - в 3-й строке примера (std::autoptr...) можно как-то сократить запись, чтоб не повторять несколько раз new...

auto_ptr в connect() - C++ Qt
после того как заменил обычный указатель на умный std::auto_ptr&lt;QTimer&gt; timer(new QTimer); перестал работать connect(timer,...

Передать в функцию std::auto_ptr - C++ Builder
Доброго! Создаю массив std::auto_ptr&lt;TStringList&gt; lst(new TStringList); как правильно или в обще его передать в функцию, типа...

Отличие std::auto_ptr<SomeType> от boost::shared_ptr<SomType> - Boost C++
Господа программисты, хочу задать вам вопрос: чем умный указатель std::auto_ptr&lt;SomeType&gt; отличается от бустового умного указателя...


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

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

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