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

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

Восстановить пароль Регистрация
 
Suares
0 / 0 / 0
Регистрация: 28.02.2013
Сообщений: 106
07.12.2013, 00:30     Создается объект абстрактного класса:( #1
Вот допустим у меня есть класс:
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 для печати всей таблицы.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,917
Записей в блоге: 2
Завершенные тесты: 1
07.12.2013, 00:35     Создается объект абстрактного класса:( #2
Цитата Сообщение от Suares Посмотреть сообщение
При этом мне нужна чисто виртуальная функция getData для печати всей таблицы.
зачем? Здесь вообще не понятно нафига она нужна
ninja2
 Аватар для 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
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,917
Записей в блоге: 2
Завершенные тесты: 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
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,917
Записей в блоге: 2
Завершенные тесты: 1
07.12.2013, 01:29     Создается объект абстрактного класса:( #7
Цитата Сообщение от Suares Посмотреть сообщение
Иначе как я буду в таблице все типы ячеек содержать.
В общем читайте про полиморфизм, прежде чем пытаться с ним работать.
alsav22
5282 / 4801 / 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
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.12.2013, 02:38     Создается объект абстрактного класса:( #10
Как вы себе эту таблицу представляете?
ninja2
 Аватар для 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
5282 / 4801 / 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++ Использование абстрактного класса
C++ Не получается создать объект унаследованный от абстрактного класса
Как обратится к обьекту класса, являющегося наследником абстрактного класса C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 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     Создается объект абстрактного класса:(
Ответ Создать тему
Опции темы

Текущее время: 19:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru