Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
1 / 1 / 0
Регистрация: 28.10.2019
Сообщений: 48
1

"Выражение должно иметь тип указателя" не пойму в чем ошибка

16.05.2020, 15:20. Показов 2485. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пишу свою реализацию умного указателя
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
template <typename T>
class scoped_ptr
{
public:
    typedef T element_type; 
    explicit scoped_ptr(T* p = new T) : ptr(p){}
 
    ~scoped_ptr() {
        delete ptr;
    }
 
   auto *get() 
    {
       return ptr;
    }
    auto *operator->() {
        return *get();
    }
 
    auto *operator*() {
        return *get();
    }
 
 
 
    void reset(void)
    {
        delete ptr;
    }
    void reset(T* ptr = new T) {
        delete this->ptr;
        this->ptr = ptr;
    }
    auto release()
    {
        return ptr;
    }
    
    explicit operator bool() const {
        if (ptr) { return true; }
        else { return false; }
    }
private:
    T* ptr;
};
При такой записи выдает ряд ошибок:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct entity {
            int f1;
            string f2;
        };
 
scoped_ptr<entity> const ptr{ new entity{10, "hello"} };
 
        assert(ptr->f1 == 10); //ERROR:Выражение должно иметь тип указателя
        assert(ptr->f2 == "hello");
 
        assert((*ptr).f1 == 10);//ERROR:отсутствует оператор " * " соответствующий этим операндам
        assert((*ptr).f2 == "hello");//типы операндов const scoped_ptr<enity>
 
        assert(ptr.get()->f1 == 10);//ERROR:объект содержит квалификаторы типа несовместимы с  элементом функцию
        assert(ptr.get()->f2 == "hello");//тип объекта:const scoped_ptr<enity>
буду благодарен если поможете исправить
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.05.2020, 15:20
Ответы с готовыми решениями:

Ошибка выражение должно иметь тип указателя на объект
Как устранить проблему? #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;stdlib.h&gt;...

Ошибка! выражение должно иметь тип указателя на объект
Строка 41 ошибка #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;math.h&gt; #include...

Ошибка № Е0142 Выражение должно иметь тип указателя на объект
Добрый день, господа. Объясните пожалуйста в чем ошибка. Нужна функция программы которая свичом...

Ошибка № Е0142 Выражение должно иметь тип указателя на объект
Наткнулся на проблему при написании программы. Не знаю как решить #include &quot;stdafx.h&quot; #include...

Выражение должно иметь тип указателя
Задание: Дано число 3466734. Посчитать кол-во цифр этого числа, которые меньше А. А вводится с...

7
 Аватар для FFPowerMan
2131 / 1214 / 503
Регистрация: 11.10.2018
Сообщений: 6,141
16.05.2020, 15:21 2
И в какой строке ошибка?
0
1 / 1 / 0
Регистрация: 28.10.2019
Сообщений: 48
16.05.2020, 15:23  [ТС] 3
Цитата Сообщение от Serega- Посмотреть сообщение
C++
1
2
3
4
5
6
assert(ptr->f1 == 10); //ERROR:Выражение должно иметь тип указателя
assert(ptr->f2 == "hello");
assert((*ptr).f1 == 10);//ERROR:отсутствует оператор " * " соответствующий этим операндам
assert((*ptr).f2 == "hello");//типы операндов const scoped_ptr<enity>
assert(ptr.get()->f1 == 10);//ERROR:объект содержит квалификаторы типа несовместимы с  элементом функцию
assert(ptr.get()->f2 == "hello");//тип объекта:const scoped_ptr<enity>
в этих, я подписал ошибки
0
 Аватар для FFPowerMan
2131 / 1214 / 503
Регистрация: 11.10.2018
Сообщений: 6,141
16.05.2020, 15:24 4
C++
1
#include <cassert>
не забыли подключить?
0
1 / 1 / 0
Регистрация: 28.10.2019
Сообщений: 48
16.05.2020, 15:26  [ТС] 5
подключена
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
16.05.2020, 15:26 6
Лучший ответ Сообщение было отмечено Serega- как решение

Решение

Serega-, у вас объект константный, а все операции, которые вы разрешили для него - не могут работать с константой.
Это основная ошибка.
0
1 / 1 / 0
Регистрация: 28.10.2019
Сообщений: 48
16.05.2020, 15:28  [ТС] 7
упс, недосмотрел... Спасибо, извините за беспокойство!
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
16.05.2020, 15:39 8
Лучший ответ Сообщение было отмечено Serega- как решение

Решение

Цитата Сообщение от Serega- Посмотреть сообщение
C++
1
2
3
    auto *operator->() {
        return *get();
    }
Также вот в этом фрагменте зачем-то делаете разыменование.

Цитата Сообщение от Serega- Посмотреть сообщение
C++
1
2
3
    auto *operator*() {
        return *get();
    }
А в этом зачем-то пытаетесь вернуть указатель, когда нужно возвращать ссылку.

Цитата Сообщение от Serega- Посмотреть сообщение
C++
1
explicit scoped_ptr(T* p = new T) : ptr(p){}
А это вот семантическая ошибка в текущих условиях. Указатель неявно сам для себя создает объект. Такая семантика допустима, но тогда это явно должно быть отражено в контракте класса. К тому же вам стоит подумать о том, что вы будете делать, если у вашего T не будет доступного конструктора по умолчанию.

Цитата Сообщение от Serega- Посмотреть сообщение
C++
1
2
3
4
    void reset(void)
    {
        delete ptr;
    }
Метод reset ломает инвариант объекта. После его использования объект находится в некорректном состоянии, любое действие с ним, например попытка удаления, приведет к ошибке. Подсказка: нужно занулить ptr.
Цитата Сообщение от Serega- Посмотреть сообщение
C++
1
2
3
4
    auto release()
    {
        return ptr;
    }
А этот метод делает не то, что описано в его названии. Он возвращает копию указателя, но владение не отдает.
0
16.05.2020, 15:39
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.05.2020, 15:39
Помогаю со студенческими работами здесь

Выражение должно иметь тип указателя
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; struct laiks...

Выражение должно иметь тип указателя
что тут не так IClientEntity *player=...

Выражение должно иметь тип указателя
if (Settings::Misc::misc_Bhop) { if (pCmd-&gt;buttons &amp; IN_JUMP &amp;&amp; !(!flag-&gt;GetMoveType &amp;...

Выражение должно иметь тип указателя на класс
Добрый день! Столкнулся с описанной выше проблемой, не могу понять что к чему, подскажите,...

Выражение должно иметь тип указателя на обьект
#include &quot;pch.h&quot; #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; int main(){...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
[golang]
alhaos 28.01.2025
/ / https:/ / leetcode. com/ studyplan/ top-interview-150/ package topInterview / / majorityElement / / / / 169. Majority Element / / Given an array nums of size n, return the majority element. / / . . .
Как получить список всех файлов коммита в Git
bytestream 28.01.2025
Система контроля версий Git представляет собой мощный инструмент для управления изменениями в программном коде и других файлах проекта. В основе работы Git лежит концепция коммитов - снимков. . .
Как записать только часть изменений файла в Git
bytestream 28.01.2025
В процессе разработки программного обеспечения часто возникает необходимость сохранить только определенные изменения из множества внесенных правок в файлах. Система контроля версий Git предоставляет. . .
[golang] 80. Remove Duplicates from Sorted Array II
alhaos 28.01.2025
В предоставленном упорядоченном по возрастанию целочисленном слайсе, оставить уникальные элементы полюс один возможный дубликат. Вернуть количество таких элементов. / / . . .
Что такое внедрение зависимостей и для чего оно применяется
bytestream 27.01.2025
В современной разработке программного обеспечения одной из ключевых проблем является управление зависимостями между различными компонентами системы. Внедрение зависимостей (Dependency Injection, DI). . .
Как установить cellpadding и cellspacing в CSS
bytestream 27.01.2025
При создании веб-страниц с табличными данными разработчики часто сталкиваются с необходимостью правильного оформления внутренних и внешних отступов в таблицах. В традиционной разметке HTML для этих. . .
Чем отличаются public, protected, package-private и private в Java
bytestream 27.01.2025
В языке программирования Java механизм модификаторов доступа играет ключевую роль в реализации одного из фундаментальных принципов объектно-ориентированного программирования - инкапсуляции. . . .
Зачем нужно explicit в C++. Преобразование типов
bytestream 27.01.2025
В мире программирования на C++ управление преобразованием типов данных играет crucial роль в создании надежного и безопасного кода. Язык C++ предоставляет множество механизмов для контроля над. . .
Как создать удалённую (remote) ветку в Git
bytestream 27.01.2025
Система контроля версий Git стала неотъемлемой частью современной разработки программного обеспечения, предоставляя разработчикам мощные инструменты для управления кодовой базой. Одним из ключевых. . .
Как создать утечку памяти в Java
bytestream 27.01.2025
Утечка памяти в Java представляет собой ситуацию, когда программа неэффективно использует доступную память, удерживая ссылки на объекты, которые больше не нужны для работы приложения. Несмотря на. . .
КуМир: как решать задачи на числа
bytestream 27.01.2025
КуМир (Комплект Учебных МИРов) представляет собой уникальную образовательную среду программирования, разработанную специально для обучения основам алгоритмизации и программирования. Эта система. . .
Исполнитель Черепаха в КуМир: как решать задачи
bytestream 27.01.2025
Исполнитель Черепаха в системе КуМир представляет собой мощный образовательный инструмент, который помогает освоить основы программирования через визуальное представление результатов выполнения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru