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

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

Войти
Регистрация
Восстановить пароль
 
Suares
0 / 0 / 0
Регистрация: 28.02.2013
Сообщений: 106
#1

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

07.12.2013, 00:30. Просмотров 662. Ответов 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 для печати всей таблицы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.12.2013, 00:30     Создается объект абстрактного класса:(
Посмотрите здесь:

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

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

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

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

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

Почему не создается второй объект класса? - C++
#include &lt;string&gt; // Заголовочный файл students.h class students { public: students(std::string user_name, std::string...

Зачем для указателя на объект класса создается отдельный класс - C++
Читаю книгу Джефа Элджера &quot;Библиотека программиста С++&quot;, там в главе про умные указатели приводится пример, где для указателя на класс...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
13063 / 7326 / 817
Регистрация: 27.09.2012
Сообщений: 18,085
Записей в блоге: 3
Завершенные тесты: 1
07.12.2013, 00:35     Создается объект абстрактного класса:( #2
Цитата Сообщение от Suares Посмотреть сообщение
При этом мне нужна чисто виртуальная функция getData для печати всей таблицы.
зачем? Здесь вообще не понятно нафига она нужна
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
07.12.2013, 01:03     Создается объект абстрактного класса:( #3
Цитата Сообщение от Suares Посмотреть сообщение
Я это понимаю, но не пойму как от этого уйти При этом мне нужна чисто виртуальная функция getData для печати всей таблицы.
В абстрактном классе обычно собраны все одинаковые методы которые находятся в производных класса, абстрактный класс выступает как интерфейс. Ты должен в производном классе создать реальный метод getData() .
Suares
0 / 0 / 0
Регистрация: 28.02.2013
Сообщений: 106
07.12.2013, 01:15  [ТС]     Создается объект абстрактного класса:( #4
Цитата Сообщение от 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];"
Croessmah
Модератор
Эксперт CЭксперт С++
13063 / 7326 / 817
Регистрация: 27.09.2012
Сообщений: 18,085
Записей в блоге: 3
Завершенные тесты: 1
07.12.2013, 01:20     Создается объект абстрактного класса:( #5
Цитата Сообщение от Suares Посмотреть сообщение
Но всё равно ошибка в строке
потому что Cell АБСТРАКТНЫЙ КЛАСС!!!
Создавайте StringCell тогда!
Suares
0 / 0 / 0
Регистрация: 28.02.2013
Сообщений: 106
07.12.2013, 01:27  [ТС]     Создается объект абстрактного класса:( #6
Цитата Сообщение от Croessmah Посмотреть сообщение
Создавайте StringCell тогда!
Я ж хочу в классе Table сделать указатель на ячейки типа IntCell, StringCell через базовый класс Cell, т. е. Cell** m_Table; Иначе как я буду в таблице все типы ячеек содержать.
Croessmah
Модератор
Эксперт CЭксперт С++
13063 / 7326 / 817
Регистрация: 27.09.2012
Сообщений: 18,085
Записей в блоге: 3
Завершенные тесты: 1
07.12.2013, 01:29     Создается объект абстрактного класса:( #7
Цитата Сообщение от Suares Посмотреть сообщение
Иначе как я буду в таблице все типы ячеек содержать.
В общем читайте про полиморфизм, прежде чем пытаться с ним работать.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.12.2013, 01:30     Создается объект абстрактного класса:( #8
Цитата Сообщение от Suares Посмотреть сообщение
Я ж хочу в классе Table сделать указатель на ячейки типа IntCell, StringCell через базовый класс Cell, т. е. Cell** m_Table; Иначе как я буду в таблице все типы ячеек содержать.
Указатель никто не мешает сделать, но зачем массив объектов абстрактного класса пытаетесь создать?
Suares
0 / 0 / 0
Регистрация: 28.02.2013
Сообщений: 106
07.12.2013, 02:17  [ТС]     Создается объект абстрактного класса:( #9
Цитата Сообщение от 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]; // ВОТ ТУТ Я НЕ МОГУ ПОНЯТЬ ДРУГОГО СПОСОБА СДЕЛАТЬ ТАБЛИЦУ
}
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.12.2013, 02:38     Создается объект абстрактного класса:( #10
Как вы себе эту таблицу представляете?
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
07.12.2013, 04:09     Создается объект абстрактного класса:( #11
Цитата Сообщение от Suares Посмотреть сообщение
Иначе как я буду в таблице все типы ячеек содержать.
Ты к ним и так имеешь доступ, базовый класс имеет доступ к членам производного класса. Производный класс - это тот же базовый класс только расширеный .

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

Я хочу что бы моя таблица содержала двумерный массив ячеек, где ячейки у меня это мой базовый класс Cell
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.12.2013, 14:04     Создается объект абстрактного класса:( #13
Цитата Сообщение от 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;
}
Миниатюры
Создается объект абстрактного класса:(  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2013, 14:12     Создается объект абстрактного класса:(
Еще ссылки по теме:

Использование абстрактного класса - C++
Доброго времени. Использую абстрактный класс Algorithm с абстрактным методом Calculate() и 5 производных от него классов, реализующих тот...

Наследование абстрактного класса - C++
Не могли бы вы мне объяснить данный код: Actions *NewAct = new Array(); // строка 1 ((Array *)NewAct)-&gt;Set_arr(count); // строка 2 ...

Деструктор абстрактного класса - C++
Почему деструктор абстрактного класса нужно делать виртуальным?

Реализация абстрактного класса - C++
Создать абстрактный базовый класс Function (функция) с виртуальными методами вычисления значения функции у = f(x) в заданной точке х и...

Объекты абстрактного класса - C++
Разбираю пример. В программе задается сразу 6 объектов. А нужно, чтобы количество объектов вводилось пользователем с клавиатуры. ...


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

Или воспользуйтесь поиском по форуму:
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.12.2013, 14:12     Создается объект абстрактного класса:( #14
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;
}
Миниатюры
Создается объект абстрактного класса:(  
Yandex
Объявления
07.12.2013, 14:12     Создается объект абстрактного класса:(
Ответ Создать тему
Опции темы

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