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

Двумерный массив на указателях с++

24.11.2021, 19:50. Показов 1955. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, возникает ошибка при создании двумерного массива в классе Shape
"./ccZTbQuT.o: In function `Shape::Shape()':
main.cpp.text._ZN5ShapeC2Ev[_ZN5ShapeC5Ev]+0x9): undefined reference to `vtable for Shape'
collect2: error: ld returned 1 exit status"


Класс Shape содержит в себе только виртуальные методы. пробовала в мэйне записать массив так:

C++
1
2
3
 
Shape** tab = new Shape*[row];
tab[0] = new Shape[column];
и так:

C++
1
2
3
4
 
Shape** tab = new Shape*[row];
for(int i = 0; i < row; i++){
   tab[i]=new Shape[column];  }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.11.2021, 19:50
Ответы с готовыми решениями:

Как создать двумерный динамический массив на указателях?
Имеется вот такой код, но если поставить **b выбивает ошибку; unsafe public static void smejn() { int kol...

Двумерный массив. Ввести двумерный массив, найти сумму элементов каждого столбца
Ввести двумерный массив, найти сумму элементов каждого столбца.

Двумерный массив. Заполнить и вывести двумерный массив БЕЗ использования цикла FOR
Заполнить ивывести двумерный массив БЕЗ использования цикла FOR очень срочно!!!

25
Модератор
Эксперт С++
 Аватар для zss
13769 / 10962 / 6491
Регистрация: 18.12.2011
Сообщений: 29,236
24.11.2021, 20:26
Если Shape абстрактный класс, то его экземпляр создать нельзя.
Создавайте экземпляры производного класса, например
C++
1
2
3
4
Shape** tab = new Shape*[3];
tab[0]=new TRiangle[column]; 
tab[1]=new Circle[column]; 
tab[2]=new Rectangle[column];
2
Гвоздь Задиров
 Аватар для Folian
1718 / 1117 / 337
Регистрация: 25.01.2019
Сообщений: 2,940
24.11.2021, 20:27
Цитата Сообщение от heplme Посмотреть сообщение
содержит в себе только виртуальные методы.
Создаёшь объект абстрактного класса?

Кот в студию!
0
0 / 0 / 0
Регистрация: 11.11.2021
Сообщений: 15
24.11.2021, 20:36  [ТС]
zss, у меня есть два производных класса Circle u Square, но даже если напишу

C++
1
2
 tab[0] = new Square[column];
 tab[1] = new Circle[column];
то выдает все ту же ошибку
0
фрилансер
 Аватар для Алексей1153
6441 / 5635 / 1127
Регистрация: 11.10.2019
Сообщений: 14,981
24.11.2021, 20:38
heplme, код покажи
0
0 / 0 / 0
Регистрация: 11.11.2021
Сообщений: 15
24.11.2021, 20:42  [ТС]
Алексей1153,

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
#include<iostream>
using namespace std;
 
static constexpr float P = 3.14;
 
class Shape{
    public:
    virtual float perimeter();
    virtual void disp();
    virtual void input();
};
 
class Circle2 : public Shape{
    public:
   
    virtual float perimeter() override {return 2*P*m_radius; };
    float squareCircle(){return P*m_radius*m_radius;};
    virtual void disp() override {cout << m_name << " " << m_radius << " "; };
    virtual void input() override {cin >> m_name >> m_radius ; };
 
   
    private:
    string m_name;
    float m_radius;
    
};
 
 
class Square : public Shape{
    public:
     virtual float perimeter() override {return 4*m_side; };
     float squareSquare(){return m_side*m_side;};
     virtual void disp() override {cout << m_name << " " << m_side << " "; };
     virtual void input() override {cin >> m_name >> m_side ; };
    
    private:
    string m_name;
    float m_side;
    
    
};
 
 
int main(){
 
int row, column;
cin >> row >> column;
 
 
Shape** tab = new Shape*[row];
tab[0] = new Square[column];
 
return 0;
}
0
фрилансер
 Аватар для Алексей1153
6441 / 5635 / 1127
Регистрация: 11.10.2019
Сообщений: 14,981
24.11.2021, 20:50
heplme, а чего огрызок кода то ? Хотя, и так видно - нет определения функций в Shape

Добавлено через 2 минуты
https://onlinegdb.com/mKKgS9LHl
1
Гвоздь Задиров
 Аватар для Folian
1718 / 1117 / 337
Регистрация: 25.01.2019
Сообщений: 2,940
24.11.2021, 20:51
C++
1
2
3
4
5
6
7
class Shape{
public:
    virtual float perimeter() = 0;
    virtual void disp() = 0;
    virtual void input() = 0;
    virtual ~Shape(){};
};
1
0 / 0 / 0
Регистрация: 11.11.2021
Сообщений: 15
24.11.2021, 20:55  [ТС]
Алексей1153, спасибо большое. В одной программе не определяла функции, и там все работало. Вот думала, что так везде можно. Теперь поняла <3

Добавлено через 48 секунд
Folian, благодарю <3
0
фрилансер
 Аватар для Алексей1153
6441 / 5635 / 1127
Регистрация: 11.10.2019
Сообщений: 14,981
24.11.2021, 20:56
heplme, чистые функции тоже можно сделать (как показано выше =0 ), но создать экземпляр Shape будет нельзя
1
0 / 0 / 0
Регистрация: 11.11.2021
Сообщений: 15
24.11.2021, 21:19  [ТС]
Алексей1153, а можно еще спросить, что здесь не так, потому что по всей видимости происходит утечка памяти
Вот main с условием задания:

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
int row, column;
            cin >> row >> column;
 
            Shape** tab = new Shape*[row];
 
            /* cоздание двумерного массива, в котором в парных строках находится обьект
            классы круг, а в непарных обьект классы Прямоугольник
            
            */
           
            for(int i = 0; i < row; i++){  
              if(i%2) tab[i] = new Circle2[column];
              else tab[i] = new Square[column];
           
            }
            
            //заполнение массива
        
            for(int i = 0; i < row; i++){
              for(int j = 0; j < column; j++){
                tab[i][j].input();
              }
             }
             
             //вывести за данными колонной и строчкой вместимость ячейки массива
         
            cin >> row >> column;
            tab[row][column].disp();
0
Гвоздь Задиров
 Аватар для Folian
1718 / 1117 / 337
Регистрация: 25.01.2019
Сообщений: 2,940
24.11.2021, 21:21
Цитата Сообщение от Алексей1153 Посмотреть сообщение
но создать экземпляр Shape будет нельзя
ИМХО, как объект оно немножко бесполезное, а как интерфейс как раз годное
0
фрилансер
 Аватар для Алексей1153
6441 / 5635 / 1127
Регистрация: 11.10.2019
Сообщений: 14,981
24.11.2021, 21:40
Цитата Сообщение от heplme Посмотреть сообщение
происходит утечка памяти
нет освобождения памяти при помощи delete
0
Гвоздь Задиров
 Аватар для Folian
1718 / 1117 / 337
Регистрация: 25.01.2019
Сообщений: 2,940
24.11.2021, 22:12
Цитата Сообщение от heplme Посмотреть сообщение
cin >> row >> column;
            tab[row][column].disp();
Ещё размер затирается.
Цитата Сообщение от heplme Посмотреть сообщение
Shape** tab = new Shape*[row];
/* cоздание двумерного массива, в котором в парных строках находится обьект
            классы круг, а в непарных обьект классы Прямоугольник
*/
for(int i = 0; i < row; i++){  
              if(i%2) tab[i] = new Circle2[column];
              else tab[i] = new Square[column];
}
А ещё так нельзя. Двумерный массив по интерфейсу получается как паршивый коньяк, через три звезды.

Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    A*** a = new A**[y];
    for(size_t i { 0 }; i < y; ++i)
    {
        a[i] = new A*[x];
        for(size_t j { 0 }; j < x; ++j)
            a[i][j] = new B;
    }
 
 
    for(size_t i { 0 }; i < y; ++i)
        for(size_t j { 0 }; j < x; ++j)
            a[i][j]->f();
 
    for(size_t i { 0 }; i < y; ++i)
    {
        for(size_t j { 0 }; j < x; ++j)
            delete a[i][j];
        delete [] a[i];
    }
    delete [] a;
0
фрилансер
 Аватар для Алексей1153
6441 / 5635 / 1127
Регистрация: 11.10.2019
Сообщений: 14,981
24.11.2021, 22:14
Цитата Сообщение от Folian Посмотреть сообщение
Двумерный массив по интерфейсу получается как паршивый коньяк, через три звезды.
так, кому-то больше не наливать
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
24.11.2021, 22:17
Цитата Сообщение от heplme Посмотреть сообщение
tab[0] = new Shape[column];
Возможно непонимание вызвано тем фактом, что когда создается массив сложных типов каждый его член создается.
Этой строкой вы СОЗДАЕТЕ column штук объектов класса Shape, которые, увы, создать нельзя, потому что "Класс Shape содержит в себе только виртуальные методы".
1
Гвоздь Задиров
 Аватар для Folian
1718 / 1117 / 337
Регистрация: 25.01.2019
Сообщений: 2,940
24.11.2021, 22:23
Цитата Сообщение от Алексей1153 Посмотреть сообщение
так, кому-то больше не наливать
Я накосячил?
0
фрилансер
 Аватар для Алексей1153
6441 / 5635 / 1127
Регистрация: 11.10.2019
Сообщений: 14,981
24.11.2021, 22:26
Folian, кубик заполнил заместо двумерного )

Добавлено через 1 минуту
Folian, аа, ты туда указатель засунул. Нет, тогда всё так, сорри )
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
24.11.2021, 22:33
Пользуйтесь массивами указателей.
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
#include <iostream>
#include <iomanip>
 
class Shape {
public:
    virtual const std::string &getName() const = 0;
    virtual ~Shape() {};
};
 
class Triangle : public Shape {
public:
    const std::string &getName() const override {
        static std::string name = "triangle";
        return name;
    }
};
 
class Circle : public Shape {
public:
    const std::string &getName() const override {
        static std::string name = "circle";
        return name;
    }
};
 
int main() {
 
    int rows = 7;
    int cols = 5;
 
    // shapes -- двумерный массив указателей на Shape
    Shape ***shapes = new Shape**[rows];
    for (int i = 0; i < rows; ++i) {
        shapes[i] = new Shape*[cols];
    }
 
    // заполняем как попало
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            if (((i * cols + j) % 2 == 0)) {
                shapes[i][j] = new Circle;
            } else {
                shapes[i][j] = new Triangle;
            }
        }
    }
 
 
    // выводим
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            std::cout << std::setw(10) << shapes[i][j]->getName();
        }
        std::cout << std::endl;
    }
 
    // Не забыть удалить
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            delete shapes[i][j];
        }
        delete [] shapes[i];
    }
    delete [] shapes;
    return 0;
}
Есть ещё умные указатели, которые сами удаляют содержимое, но это наверно, сложновато будет.
1
Гвоздь Задиров
 Аватар для Folian
1718 / 1117 / 337
Регистрация: 25.01.2019
Сообщений: 2,940
24.11.2021, 22:38
Алексей1153, не, ну а как иначе?
C++
1
A* p = new B[2];
Тут как бы "выдели удава в два слона", а указатель-то бегать будет всё равно в попугаях
Чёт даже вроде у Страуструпа видел выделение через интерфейс одномерного через две звезды.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.11.2021, 22:38
Помогаю со студенческими работами здесь

Создать двумерный массив, опираясь на другой двумерный массив
У меня есть такой массив 0 0 0 0 0 0 0 6 3 2 2 8 9 3 7 6 8 3 4 5 1 0 0 0 0 0 0 0 0 0 0 0 0...

Считать из текстового файла двумерный массив и записать его двумерный динамический
Есть текстовый файл(см.Рисунок) и его надо загрузить в динамический массив(почему динамический?потому что массив будет создаваться в...

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

Дан двумерный массив A N*N). Сформировать двумерный упорядоченныймассив (А 11<=A 12<= .<=A 23<=.<=A nn)
Дан двумерный массив A(N*N). Сформировать двумерный упорядоченный массив (А11&lt;=A12&lt;= ...&lt;=A23&lt;=...&lt;=Ann).

Как можно вложить двумерный массив в двумерный?
Нужно написать программу перемножения двух матриц размерностью МxМ, элементы которых, матрицы размерностью КxК... Подскажите (желательно с...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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