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

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

Войти
Регистрация
Восстановить пароль
 
MobileRider
2 / 2 / 0
Регистрация: 19.11.2013
Сообщений: 14
#1

Абстрактный тип данных - C++

19.11.2013, 12:01. Просмотров 932. Ответов 15
Метки нет (Все метки)

Необходимо создать АТД class, в области данных которого содержится динамическое строка и ёё длина. Среди методов класса создать конструкторы и деструктор (если это необходимо).

Помогите новичку)
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2013, 12:01     Абстрактный тип данных
Посмотрите здесь:

Абстрактный тип данных - C++
Помогите пожалуйста вот с таким задание: Создать абстрактный тип данных - человек, у которого есть имя и возраст (структура). Определить...

Абстрактный тип данных - C++
Доброго времени суток! Помогите, пожалуйста, с заданием: Создать список произвольной организации. Областью данных каждого элемента...

Абстрактный тип данных - C++
1) Добавьте к АТД «стек» функцию top, что получает элемент из верхушки стека, не удаляя его, и реализуйте ее аналогично функции pop. В...

Абстрактный тип данных - C++
Пользуясь указателями, напишите реализацию списке открытого с двух сторон, в котором вставка и удаление происходят с обоих концов но не...

абстрактный тип данных - C++
надо написать на С++... разработать абстрактный тип данных :двусвязный циклический список. атд должен обеспечивать выполнение следующих...

Разработайте и реализуйте абстрактный тип данных - C++
Помогите пожалуйста с задачей. Разработайте и реализуйте абстрактный тип данных для представления календаря. Он должен представлять...

Абстрактный тип данных-Список(С++ алгоритмы) - C++
Абстрактный тип данных "Список". Сформировать список, в котором сохраняется информация о предметах, изъятых на таможне за отчетный...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
LuxArt
33 / 20 / 2
Регистрация: 14.11.2013
Сообщений: 85
19.11.2013, 12:08     Абстрактный тип данных #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class String
{
private:
    char  *str;
    int  length;
    
public:
    String(char *s, int l)
    {
        str = new char[l];
        strcpy(str, s);
        length = l;
    }
    
    ~String()
    {
        delete [] str;
    }
};
MobileRider
2 / 2 / 0
Регистрация: 19.11.2013
Сообщений: 14
19.11.2013, 12:18  [ТС]     Абстрактный тип данных #3
LuxArt, Огромное спасибо!)
LuxArt
33 / 20 / 2
Регистрация: 14.11.2013
Сообщений: 85
19.11.2013, 12:21     Абстрактный тип данных #4
MobileRider, Пожалуйста
zss
Модератор
Эксперт С++
6284 / 5887 / 1908
Регистрация: 18.12.2011
Сообщений: 15,108
Завершенные тесты: 1
19.11.2013, 12:55     Абстрактный тип данных #5
LuxArt, А с чего Вы решили, что Ваш класс абстрактный?
У абстрактного класса обязательно должна существовать хотя бы одна
чисто виртуальная функция.
Например так:
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
class BaseString
{
    virtual void Print()=0;
};
class String:public BaseString
{
private:
    char  *str;
    int  length;
    
public:
    void Print()
    {
          cout<<str<<endl;
    }
    String(char *s, int l)
    {
        str = new char[l];
        strcpy(str, s);
        length = l;
    }
    
    ~String()
    {
        delete [] str;
    }
};
int main()
{
// Указатель на базовый класс инициализируете адресом производного класса
     BaseStrint* S=new String("haha",4);
     S->Print();
}
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
19.11.2013, 12:58     Абстрактный тип данных #6
zss, а еще бы хорошо сделать виртуальный деструктор. Иначе - UB (строка 31)
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
19.11.2013, 13:02     Абстрактный тип данных #7
zss, Гм... Не абстрактный класс, а АТД.
zss
Модератор
Эксперт С++
6284 / 5887 / 1908
Регистрация: 18.12.2011
Сообщений: 15,108
Завершенные тесты: 1
19.11.2013, 13:03     Абстрактный тип данных #8
Попробуем без виртуального деструктора
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
class BaseString
{
private:
    char  *str;
    int  length;
public:
    virtual void Print()=0;
    BaseString(char *s, int l)
    {
        str = new char[l];
        strcpy(str, s);
        length = l;
    }
    
    ~BaseString()
    {
        delete [] str;
    }
};
class String:public BaseString
{
public:
    void Print()
    {
          cout<<str<<endl;
    }
    String(char *s, int l):BaseString(s,l){}
    ~String():~BaseString(){}
};
int main()
{
// Указатель на базовый класс инициализируете адресом производного класса
     BaseStrint* S=new String("haha",4);
     S->Print();
}
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
19.11.2013, 13:06     Абстрактный тип данных #9
Цитата Сообщение от zss Посмотреть сообщение
~String():~BaseString(){}
Это ещё что такое? Хотите деструктор базового класса несколько раз вызвать?
zss
Модератор
Эксперт С++
6284 / 5887 / 1908
Регистрация: 18.12.2011
Сообщений: 15,108
Завершенные тесты: 1
19.11.2013, 13:08     Абстрактный тип данных #10
Цитата Сообщение от ForEveR Посмотреть сообщение
Не абстрактный класс, а АТД.
Надо спросить у автора поста MobileRider, что же на самом деле ему надо было?

Добавлено через 1 минуту
Цитата Сообщение от Tulosba Посмотреть сообщение
Хотите деструктор базового класса несколько раз вызвать?
Да, что-то я зарапортовался....
Raali
622 / 326 / 34
Регистрация: 06.07.2013
Сообщений: 1,054
Завершенные тесты: 1
19.11.2013, 13:14     Абстрактный тип данных #11
Цитата Сообщение от zss Посмотреть сообщение
Надо спросить у автора поста MobileRider, что же на самом деле ему надо было?
спрашиваем...
Цитата Сообщение от MobileRider Посмотреть сообщение
Необходимо создать АТД class
zss
Модератор
Эксперт С++
6284 / 5887 / 1908
Регистрация: 18.12.2011
Сообщений: 15,108
Завершенные тесты: 1
19.11.2013, 13:20     Абстрактный тип данных #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
#include <stdio.h>
#include <conio.h>
#include <string.h>
 class BaseString
{
protected:
    char  *str;
    int  length;
public:
    virtual void Print()=0;
    BaseString(char *s, int l)
    {
        str = new char[l];
        strcpy(str, s);
        length = l;
    }
    
    ~BaseString()
    {
        delete [] str;
    }
};
class String:public BaseString
{
public:
    void Print()
    {
          puts(str);
    }
    String(char *s, int l):BaseString(s,l){}
};
int main()
{
// Указатель на базовый класс инициализируете адресом производного класса
     BaseString* S=new String("haha",5);
     S->Print();
     delete S;
     String S2("haha2",6);
// Обычный вызов метода производного класса.
     S2.Print();
     _getch();
}
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
19.11.2013, 13:24     Абстрактный тип данных #13
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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 <algorithm>
#include <cstring>
#include <cassert>
 
class string
{
public:
   string() : str_(nullptr), size_(0) {}
   string(const char* str)
   {
      copy(str, strlen(str));
   }
   string(const char* str, size_t size)
   {
      copy(str, size);
   }
   string(const string& rhs)
   {
      copy(rhs.str_, rhs.size_);
   }
   string(string&& rhs) :
      str_(rhs.str_), size_(rhs.size_)
   {
      rhs.size_ = 0;
      rhs.str_ = nullptr;
   }
   string& operator = (string rhs)
   {
      swap(rhs);
      return *this;
   }
   ~string() { delete[] str_; }
   bool empty() const { return size_ == 0; }
   size_t size() const { return size_; }
   size_t length() const { return size(); }
   const char* c_str() const { return str_; }
private:
   void copy(const char* str, size_t size)
   {
      str_ = new char[size + 1];
      strncpy(str_, str, size);
      str_[size] = '\0';
      size_ = size;
   }
   void swap(string& rhs)
   {
      std::swap(str_, rhs.str_);
      std::swap(size_, rhs.size_);
   }
   char* str_;
   size_t size_;
};
 
std::ostream& operator << (std::ostream& os, const string& str)
{
   return os << str.c_str();
}
 
int main()
{
   string s = "hello";
   string other(s);
   string another(std::move(other));
   assert(!s.empty() && other.empty() && "conditions failed");
}
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
19.11.2013, 14:37     Абстрактный тип данных #14
ForEveR, искал к чему придраться, и вроде нашел:
C++
1
2
string s;
std::cout << s << std::endl;
std::string ведет себя дружелюбнее.
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
19.11.2013, 14:51     Абстрактный тип данных #15
Tulosba, Там вывод несколько по-другому реализован. В clang например так.

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
template<class _CharT, class _Traits, class _Allocator>
basic_ostream<_CharT, _Traits>&
operator<<(basic_ostream<_CharT, _Traits>& __os,
           const basic_string<_CharT, _Traits, _Allocator>& __str)
{
#ifndef _LIBCPP_NO_EXCEPTIONS
    try
    {
#endif  // _LIBCPP_NO_EXCEPTIONS
        typename basic_ostream<_CharT, _Traits>::sentry __s(__os);
        if (__s)
        {
            typedef ostreambuf_iterator<_CharT, _Traits> _Ip;
            size_t __len = __str.size();
            if (__pad_and_output(_Ip(__os),
                                 __str.data(),
                                 (__os.flags() & ios_base::adjustfield) == ios_base::left ?
                                     __str.data() + __len :
                                     __str.data(),
                                 __str.data() + __len,
                                 __os,
                                 __os.fill()).failed())
                __os.setstate(ios_base::badbit | ios_base::failbit);
        }
#ifndef _LIBCPP_NO_EXCEPTIONS
    }
    catch (...)
    {
        __os.__set_badbit_and_consider_rethrow();
    }
#endif  // _LIBCPP_NO_EXCEPTIONS
    return __os;
}
Но замечание правильное и дабы избавиться от этого можно сделать как минимум так

C++
1
2
3
4
std::ostream& operator << (std::ostream& os, const string& str)
{
   return os << (str.c_str() ? str.c_str() : "");
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2013, 15:05     Абстрактный тип данных
Еще ссылки по теме:

Как описать абстрактный тип данных? - C++
очередь

Создать абстрактный тип данных - класс вектор - C++
Создать абстрактный тип данных - класс вектор (динамический массив), который имеет указатель на double, число элементов и переменную...

Создать абстрактный тип данных-класс вектор - C++
Создать абстрактный тип данных-класс вектор, который имеет указатель на long, число элементов и переменную состояния. Определить...

Создать абстрактный тип данных - класс вектор - C++
Доброго времени суток! Тут задачку такую не хилую подогнали. Нужна помощь опытных программистов. Ребят, выручайте, без вас...

Создать абстрактный тип данных (структура) - окно - C++
Помогите пожалуйста с таким заданием, создать абстрактный тип данных (структура) - окно, у которого есть заголовок, максимальный размер,...


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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
19.11.2013, 15:05     Абстрактный тип данных #16
ForEveR, код мне всё равно понравился Поэтому плюсую.
Yandex
Объявления
19.11.2013, 15:05     Абстрактный тип данных
Ответ Создать тему
Опции темы

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