Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 28.03.2019
Сообщений: 55

Указатель на ячейку в памяти

17.07.2019, 18:35. Показов 1970. Ответов 4

Студворк — интернет-сервис помощи студентам
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
// Демонстрация использования средства динамической
// идентификации типов. 
#include <windows.h>
#include <iostream> 
#include <cstdlib>
#include <time.h>
 
using namespace std;
 
class figure
{
 protected:
  double x,y;
 public:
  figure(double i,double j)
  {
   x=i;
   y=j;
  }
  
};
 
class triangle:public figure
{
 public:
 
  triangle(double i,double j):figure(i,j){}
  double input(double i, double j);
 
};
 
double triangle :: input(double i, double j)
{
    cout << "Введите параметры треугольника: " << endl;
    cout << "X: ";
    cin >> i;
    cout << "Y: ";
    cin >> j;
    cout << "Площадь треугольника = ";
    return x * 0.5*y;
}
 
class rectangle:public figure
{
 public:
 
  rectangle(double i,double j):figure(i,j){}
  double input(double i, double j);
};
 
double rectangle::input(double i, double j)
{
    
        cout << "Генерация окружности..." << endl;
        cout << "Введите параметры: " << endl;
        cout << "X: ";
        cin >> i;
        cout << "Y: ";
        cin >> j;
        cout << "Площадь прямоугольника = ";
        return x * y;
    
}
 
class circle:public figure
{
 public:
 
  circle(double i,double j=0):figure(i,j){}
  double input(double i, double j = 0);
};
double circle::input(double i, double j = 0)
{
    cout << "Генерация окружности..." << endl;
    cout << "Введите параметры: " << endl;
    cout << "X: ";
    cin >> i;
    cout << "Площадь круга =  ";
    return 3.14159268*x*x;
}
 
figure* factory()
{
 switch(rand()%3)
 {
//Ошибка с указателями на память
  case 0:
      circle* a;
      *a->input;
    break;
  case 1:
      triangle* b;
      *b->input;
    break;
  case 2:
      rectangle* c;
      *c->input;
    break;
////////////////////////////////////////
 }
 return 0;
}
 
int main()
{
 
 system("cls");
 int i1 = GetConsoleCP();
 setlocale(LC_ALL, "Russian");
  
 srand((unsigned)time(NULL));
 figure* p;  // указатель на базовый класс
 
 int i;
 int t=0;
 int r=0;
 int c=0;
 
 // генерируем и подсчитываем объекты
 for(i=0;i<10;i++)
 {
  p=factory();  // генерируем объект
  cout << "Объект имеет тип " << typeid(*p).name();
  cout << ". ";
  // учитываем этот объект
  if(typeid(*p)==typeid(triangle))
   t++;
  if(typeid(*p)==typeid(rectangle))
   r++;
  if(typeid(*p)==typeid(circle))
   c++;
  // отображаем площадь фигуры
  
 }
 cout << endl;
 cout << "Сгенерированы следующие объекты:\n";
 cout << " треугольников: " << t << endl;
 cout << " прямоугольников: " << r << endl;
 cout << " кругов: " << c << endl;
 
 SetConsoleCP(i1);
 SetConsoleOutputCP(i1);
 
 system("pause");
 return 0;
}
Добавлено через 2 минуты
За смайлики извините, понятия не имею откуда они.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.07.2019, 18:35
Ответы с готовыми решениями:

Как обнулить указатель на одну ячейку в динамически-выделенной памяти?
Выделю память под 10 элементов: int* p = new int; Наполняю значениями: for(int i = 0; i&lt;10; i++) { p = i; } Можно...

Как создать простейшую ссылку/указатель на ячейку памяти/переменную
Здраствуйте. Подскажите пожалуйста, как сделать простейшую ссылку/указатель на яч памяти. Скажем я использовал переменную А в ...

Первый килобайт памяти обнулить. Записать в 3,8,10,12 ячейку памяти значение 64h
с помощью средств языка ассемблер написать программу, в которой первый килобайт памяти обнулить. записать в 3,8,10,12 ячейку памяти...

4
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
17.07.2019, 21:13
Цитата Сообщение от Паста Посмотреть сообщение
//Ошибка с указателями на память
Память под объект нужно выделять, а затем возвращать указатель

Добавлено через 2 минуты
Цитата Сообщение от Паста Посмотреть сообщение
typeid(*p)==typeid(triangle)
А тут лучше использовать .hash_code() или std::type_index

Добавлено через 2 минуты
Но самое главное, ваша иерархия классов не полиморфная, так что работать это все не будет
0
1 / 1 / 0
Регистрация: 16.04.2019
Сообщений: 9
18.07.2019, 21:32
Где-то читал что сверять типы run-time есть плохая практика, по крайней мере если это не отладочный билд, свидетельствующая о косяках проектирования. Не знаю насколько это правда, но логично, если не знаешь точно что и куда может прилететь -- значит что-то не так.

В общем у меня получился следующий код. Может автору пригодится.

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include <iostream>
#include <vector>
 
class Object
{
private:
    static int count;
    int ID;
public:
    Object()
    {
        count++; ID = count;
    }
    int GetID() const
    {
        return ID;
    }
    virtual void ShowMe() = 0;  
};
 
int Object::count = 0;
 
template <typename T> class Figure : public Object 
{
protected:
    int _x, _y;
public:
    static T& CreateFigure()
    {
        return * new T(); 
    }
    T& SetPos(int x, int y)
    {
        _x = x; _y = y;
        return * GetSelf();
    }
    T* GetSelf()
    {
        return static_cast<T*>(this);
    }
    void ShowMe()
    {
        GetSelf()->Show();
    }
    virtual void Show() = 0;
};
 
class Triangle : public Figure<Triangle>
{
public:
    void Show()
    {
        std::cout << "This is triangle!" << std::endl;
    }
        
};
 
class Circle : public Figure<Circle>
{
public:
    void Show()
    {
        std::cout << "This is circle!" << std::endl;
    }
        
};
 
class Rectangle : public Figure<Rectangle>
{
public:
    void Show()
    {
        std::cout << "This is rectangle!" << std::endl;
    }
        
};
 
int main(int argc, char** argv) 
{
    std::vector<Object*> objects;
    
    for (int i=0; i<100; ++i)
    {
        objects.push_back(&Triangle::CreateFigure().SetPos(1,1));
        objects.push_back(&Circle::CreateFigure().SetPos(2,2));
        objects.push_back(&Rectangle::CreateFigure().SetPos(3,3));
    }
    
    for (auto j = objects.begin(); j != objects.end(); ++j)
    {
        Object* o = *j;
        std::cout << "=================== ID:" << o->GetID() << "=======================" << std::endl; 
        
        Triangle* t = dynamic_cast<Triangle*>(o);
        if (t) 
        {
            std::cout << "Cast to triangle OK" << std::endl;
            std::cout << "Lets check..." << std::endl;
            o->ShowMe();
        }
        else std::cout << "Cast to triangle failed" << std::endl;
 
        Circle* c = dynamic_cast<Circle*>(o);
        if (c) 
        {
            std::cout << "Cast to circle OK" << std::endl;
            std::cout << "Lets check..." << std::endl;
            o->ShowMe();
        }
        else std::cout << "Cast to circle failed" << std::endl;
 
        Rectangle* r = dynamic_cast<Rectangle*>(o);
        if (r) 
        {
            std::cout << "Cast to rectangle OK" << std::endl;
            std::cout << "Lets check..." << std::endl;
            o->ShowMe();
        }
        else std::cout << "Cast to rectangle failed" << std::endl;
        
    }   
    return 0;
}
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
18.07.2019, 21:43
Цитата Сообщение от Паста Посмотреть сообщение
За смайлики извините, понятия не имею откуда они.
это потому, что не взял код в тэги
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
19.07.2019, 15:08
название темы не соответствует её содержанию.
я уж было хотел написать мануал про IA32_APIC_BASE, VA_BASE, PA_BASE, PTE, таблицу страниц в регистре cr3, ядерные MmGetPhysicalAddress и MmMapViewInSystemSpace.
а тут школьная геометрия..
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.07.2019, 15:08
Помогаю со студенческими работами здесь

Можно ли разместить переменную в нужную ячейку памяти и реально ли хранить данные, разбросанными по памяти?
Добрый день. Не могу найти информацию по двум вопросам : 1) могу ли я разместить переменную в нужную ячейку памяти. Например: int a...

Qt - Получить указатель на ячейку в QTableView
Доброго времени суток! Пытаюсь программно выделить строку в QTableView, для этого посылаю сигнал о клике мыши. Только вот кому его...

Как сдвинуть указатель на следующую ячейку в массиве?
Есть массив в main, есть функция, в функцию передаётся указатель на начало массива, функция делает вычисления, после должна перевести...

Получить указатель на соседнюю ячейку относительно другого указателя
Смысл в чем.Есть две переменные , надо чтоб было два указателя на эти переменные , но чтоб второй указатель был на соседнюю ячейку...

Функция возвращает указатель на нужную ячейку переданного массива, но адрес другой
Пишу котрольку. В функцию передается массив созданный из объектов на основе собственной структуры. Ищет в нем нужную ячейку по одному из...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru