Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

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

Не получается создать объект унаследованный от абстрактного класса - 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...

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

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

Я хочу что бы моя таблица содержала двумерный массив ячеек, где ячейки у меня это мой базовый класс Cell
0
alsav22
5426 / 4821 / 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;
}
1
Миниатюры
Создается объект абстрактного класса:(  
alsav22
5426 / 4821 / 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;
}
1
Миниатюры
Создается объект абстрактного класса:(  
07.12.2013, 14:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2013, 14:12
Привет! Вот еще темы с ответами:

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

интерфейс, в методе которого создается объект типа IDictionary и возвращается ссылка на этот объект - C++
Привет всем. Необходимо реализовать интерфейс, в методе которого создается объект типа IDictionary и возвращается ссылка на этот объект. Не...

Как обратится к обьекту класса, являющегося наследником абстрактного класса - C++
Здравствуйте! У меня есть 4 класса: один виртуальный, следующие 2 - наследуют виртуальный класс и последний класс содержит указатель на...

Поместить в динамически расширяемый массив объекты класса, производные от базового абстрактного класса - C++
Помогите пожалуйста новичку! (мне). Я хочу создать динамически расширяющийся массив указателей на базовый абстрактный класс,...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

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