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

Создается объект абстрактного класса:(

07.12.2013, 00:30. Показов 2963. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот допустим у меня есть класс:
C++
1
2
3
4
5
6
7
class Cell
{
public:
    Cell() {}
    ~Cell() {}
    virtual std::string getData() const = 0;
};
Ну и от него наследовано пару классов, IntCell, StrCell и т. д.

А также у меня есть класс:
C++
1
2
3
4
5
6
7
8
class Table
{
public:
    Table(unsigned int rows, unsigned int columns);
    ~Table();
private:
    Cell** m_Table;
};
Так вот когда я создаю объект типа Tablе:
C++
1
2
3
4
m_Table = new Cell*[m_Rows];
 
for(unsigned int i = 0; i < m_Rows; ++i)
m_Table[i] = new Cell[m_Columns];
В последней строке ошибка: не возможно создать объект абстрактного класса. Я это понимаю, но не пойму как от этого уйти При этом мне нужна чисто виртуальная функция getData для печати всей таблицы.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.12.2013, 00:30
Ответы с готовыми решениями:

Ошибка: невозможно создать объект абстрактного класса
программа для заменны слова в файле, на введенное с клавы слово!реализовать нужно через интерфейс! ошибка в строчке Text edit; не...

Создать новый объект-наследник абстрактного класса
Приветствую, друзья! У нас есть абстрактный класс AbstractClass и его наследники child1 и child2. В массиве у нас есть несколько...

Не получается создать объект унаследованный от абстрактного класса
Здравствуйте! Нужна помощь с виртуальными функциями, в теории понимаю что это, а вот с реализацией что-то совсем не получается. ...

13
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
07.12.2013, 00:35
Цитата Сообщение от Suares Посмотреть сообщение
При этом мне нужна чисто виртуальная функция getData для печати всей таблицы.
зачем? Здесь вообще не понятно нафига она нужна
1
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
07.12.2013, 01:03
Цитата Сообщение от Suares Посмотреть сообщение
Я это понимаю, но не пойму как от этого уйти При этом мне нужна чисто виртуальная функция getData для печати всей таблицы.
В абстрактном классе обычно собраны все одинаковые методы которые находятся в производных класса, абстрактный класс выступает как интерфейс. Ты должен в производном классе создать реальный метод getData() .
1
0 / 0 / 0
Регистрация: 28.02.2013
Сообщений: 106
07.12.2013, 01:15  [ТС]
Цитата Сообщение от ninja2 Посмотреть сообщение
В абстрактном классе обычно собраны все одинаковые методы которые находятся в производных класса, абстрактный класс выступает как интерфейс. Ты должен в производном классе создать реальный метод getData() .
Вот например есть у меня такой производный класс:
C++
1
2
3
4
5
6
7
class StringCell : public Cell
{
    std::string data;
public:
    StringCell(std::string s) :data(s) {}
    std::string getData() const { return data; }
};
Но всё равно ошибка в строке: "m_Table[i] = new Cell[m_Columns];"
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
07.12.2013, 01:20
Цитата Сообщение от Suares Посмотреть сообщение
Но всё равно ошибка в строке
потому что Cell АБСТРАКТНЫЙ КЛАСС!!!
Создавайте StringCell тогда!
1
0 / 0 / 0
Регистрация: 28.02.2013
Сообщений: 106
07.12.2013, 01:27  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
Создавайте StringCell тогда!
Я ж хочу в классе Table сделать указатель на ячейки типа IntCell, StringCell через базовый класс Cell, т. е. Cell** m_Table; Иначе как я буду в таблице все типы ячеек содержать.
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
07.12.2013, 01:29
Цитата Сообщение от Suares Посмотреть сообщение
Иначе как я буду в таблице все типы ячеек содержать.
В общем читайте про полиморфизм, прежде чем пытаться с ним работать.
1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
07.12.2013, 01:30
Цитата Сообщение от Suares Посмотреть сообщение
Я ж хочу в классе Table сделать указатель на ячейки типа IntCell, StringCell через базовый класс Cell, т. е. Cell** m_Table; Иначе как я буду в таблице все типы ячеек содержать.
Указатель никто не мешает сделать, но зачем массив объектов абстрактного класса пытаетесь создать?
1
0 / 0 / 0
Регистрация: 28.02.2013
Сообщений: 106
07.12.2013, 02:17  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Указатель никто не мешает сделать, но зачем массив объектов абстрактного класса пытаетесь создать?
Подскажите как мне еще можно создать двумерный массив ячеек для таблицы.
Вот допустим мои ячейки:
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
#ifndef _CELL_H_
#define _CELL_H_
 
#include <string>
#include <sstream>
typedef __int32 dword; 
 
class Cell
{
public:
    Cell() {}
    ~Cell() {}
    virtual std::string getData() const = 0;
};
 
class IntegerCell : public Cell
{
    dword data;
public:
    IntegerCell(std::string s)
    : data(::atof(s.c_str()))
    {}
 
    std::string getData() const
    {
        std::string str;
        std::ostringstream stream;
        stream << data;
        str = stream.str();
        return str;
    }
};
 
class StringCell : public Cell
{
    std::string data;
public:
    StringCell(std::string s) :data(s) {}
    std::string getData() const { return data; }
};
#endif
Далее в я создаю саму таблицу:
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
#ifndef _TABLE_H_
#define _TABLE_H_
 
#include <string>
#include <iostream>
#include "Cell.h"
 
class Table
{
public:
    class Bad_Data {};
 
    Table(unsigned int rows, unsigned int columns);
    ~Table();
 
    void print() const;
 
private:
    unsigned int m_Rows;
    unsigned int m_Columns;
 
    Cell** m_Table;
 
    void createTable();
};
#endif
И вот тут уже создания двумерного массива ячеек идет, где я запутался...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
Table::Table(unsigned int rows, unsigned int columns)
    : m_Rows(rows), m_Columns(columns)
{
    createTable();
}
 
void Table::createTable()
{
    m_Table = new Cell*[m_Rows];
 
    for(unsigned int i = 0; i < m_Rows; ++i)
        m_Table[i] = new Cell[m_Columns]; // ВОТ ТУТ Я НЕ МОГУ ПОНЯТЬ ДРУГОГО СПОСОБА СДЕЛАТЬ ТАБЛИЦУ
}
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
07.12.2013, 02:38
Как вы себе эту таблицу представляете?
1
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
07.12.2013, 04:09
Цитата Сообщение от Suares Посмотреть сообщение
Иначе как я буду в таблице все типы ячеек содержать.
Ты к ним и так имеешь доступ, базовый класс имеет доступ к членам производного класса. Производный класс - это тот же базовый класс только расширеный .

Добавлено через 2 минуты
Цитата Сообщение от Suares Посмотреть сообщение
Подскажите как мне еще можно создать двумерный массив ячеек для таблицы.
Используй двумерный массив например vector<vector<string> > от динамический массив ячеек типа string.
1
0 / 0 / 0
Регистрация: 28.02.2013
Сообщений: 106
07.12.2013, 10:07  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Как вы себе эту таблицу представляете?
У меня есть задание:
Необходимо реализовать обработчик простой электронной таблицы по аналогии с Microsoft Excel в виде программы, выполняющейся из командной строки. Программа должна уметь обрабатывать следующие типы ячеек:
EmptyCell: пустая ячейка
IntegerCell: Неотрицательное целое число (помещается в dword 32 бита)
StringCell: Текстовые строки, которые начинаются с символа ‘
ReferenceCell: Строки-выражения, которые начинаются с символа ‘=’ и могут содержать Ссылки на другие ячейки. Состоят из одной латинской буквы и следующей за ней одной цифры.

Я хочу что бы моя таблица содержала двумерный массив ячеек, где ячейки у меня это мой базовый класс Cell
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
07.12.2013, 14:04
Цитата Сообщение от Suares Посмотреть сообщение
Программа должна уметь обрабатывать следующие типы ячеек:
Цитата Сообщение от Suares Посмотреть сообщение
Я хочу что бы моя таблица содержала двумерный массив ячеек, где ячейки у меня это мой базовый класс Cell
Так ничего не получится. Можно создать (как у вас) массив указателей базового класса. Эти указатели могут ссылаться как на объекты базового класса, так и на объекты производных классов. Но, если вы хотите хранить по этим указателям объекты разных классов, то и память должны выделяться под эти конкретные классы, а не под один базовый. Потом, через виртуальные методы и указатели на базовый класс, можно будет вызывать методы именно этих классов. Код для примера:
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
#include <iostream>
#include <cstdlib>
 
using namespace std;
 
struct A
{
    virtual void f()
    {
        cout << "fA" << endl;
    }
};
 
struct B : public A
{
    virtual void f()
    {
        cout << "fB" << endl;
    }
};
 
struct C : public A
{
    virtual void f()
    {
        cout << "fC" << endl;
    }
};
 
void show(A* p, int n)
{
    for (int i = 0; i < n; ++i)
        p ->f(); // вызывается виртуальный метод того класса, с объектом которым связан указатель базового
    cout << endl;
}
 
int main () 
{
    A* p[3]; // массив указателей базового класса
    
    int n1 = 2, n2 = 3, n3 = 4;
    
    // под указатели базового класса создаются массивы базового и производных классов
    p[0] = new A[n1];
    p[1] = new B[n2];
    p[2] = new C[n3];
 
    // использование виртуальных методов
    show(p[0], n1);
    show(p[1], n2);
    show(p[2], n3);
 
    
    system("pause");
    return 0;
}
Миниатюры
Создается объект абстрактного класса:(  
1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
07.12.2013, 14:12
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
#include <iostream>
#include <cstring>
#include <cstdlib>
 
using namespace std;
 
struct A
{
    int n;
 
    A()
    {
        n = 0;
    }
    
    virtual void f()
    {
        cout << "fA" << ' ' << n << endl;
    }
};
 
struct B : public A
{
    char ch;
 
    B()
    {
        ch = 'a';
    }
 
    virtual void f()
    {
        cout << "fB" << ' ' << ch << endl;
    }
};
 
struct C : public A
{
    char str[10];
 
    C()
    {
        strcpy(str, "struct C");
    }
    
    virtual void f()
    {
        cout << "fC" << ' ' << str << endl;
        
    }
};
 
void show(A* p, int n)
{
    for (int i = 0; i < n; ++i)
        p ->f(); // вызывается виртуальный метод того класса, с объектом которым связан указатель базового
    cout << endl;
}
 
int main () 
{
    A* p[3]; // массив указателей базового класса
    
    int n1 = 2, n2 = 3, n3 = 4;
    
    // под указатели базового класса создаются массивы базового и производных классов
    p[0] = new A[n1];
    p[1] = new B[n2];
    p[2] = new C[n3];
 
    // использование виртуальных методов
    show(p[0], n1);
    show(p[1], n2);
    show(p[2], n3);
 
    
    system("pause");
    return 0;
}
Миниатюры
Создается объект абстрактного класса:(  
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.12.2013, 14:12
Помогаю со студенческими работами здесь

Не создается объект класса
Почему я не могу создать объект класса Zamovlena? Могу создать только указатель. Zamovlena.h #ifndef ZAMOVLENA_H #define ZAMOVLENA_H ...

Не создаётся объект класса
---------------------------------------Address.h-------------------------------------------------- #pragma once class Address { ...

Не создается объект класса
Только изучаю плюсы. Натолкнулся на непонятное поведение конструктора. Попробовал 2 варианта: Код 1. С объявлением и определением 1...

Не создается объект производного класса
Пожалуйста, помогите найти ошибку в коде. Не создается объект производного класса по выбору пользователя. #include&lt;iostream&gt;...

4 раза в памяти создается объект класса
Доброго времени суток! Есть следующий код: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;string&gt; using namespace...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru