С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
429 / 312 / 129
Регистрация: 09.02.2021
Сообщений: 1,096
Записей в блоге: 1
1

Ошибка в конструкторе класса Book

12.09.2021, 21:27. Показов 2553. Ответов 44
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте ,не могу исправить ошибку ,буду благодарен за помощь:
Unhandled exception at 0x79E5E625 (ucrtbased.dll) in ФФ.exe: 0xC00000FD: Stack overflow (parameters: 0x00000001, 0x00EC2FFC).
Book.cpp:
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
#include "Book.h"
 
string Book::GetAuthor()
{
    return author;
}
 
string Book::GetTitle()
{
    return title;
}
 
Book* Book::GetList()
{
    return list_of_references;
}
 
void Book::Set(string a, string t)
{
    author = a;
    title = t;
}
 
void Book::ShowAuthorAndTitle()
{
    cout << author << " " << title << endl;
}
 
void Book::ShowList()
{
    for (int i = 0; i < number; i++) {
        list_of_references[i].ShowAuthorAndTitle();
    }
}
 
Book::Book()
{
    author = "No author";
    title = "No title";
    list_of_references[number-1].Set("No", "No");
}
 
Book::~Book()
{
    delete[]list_of_references;
}
Book.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#pragma once
#include <iostream>
#include <string>
using namespace std;
class Book
{
private:
    string author;
    string title;
    int number=1;
    Book *list_of_references = new Book[number];
public:
    string GetAuthor();
    string GetTitle();
    Book* GetList();
    void Set(string a, string t);
    void ShowAuthorAndTitle();
    void ShowList();
    Book();
    ~Book();
};
1
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.09.2021, 21:27
Ответы с готовыми решениями:

Ошибка при работе с объектом класса в конструкторе другого класса
Имеется данный код: https://github.com/ubelian/glgame/tree/master/glgame В файле Food.cpp в...

Ошибка в конструкторе класса
Всем доброго времени суток! Есть простая задачка: Написать реализацию класса и короткую...

Ошибка в конструкторе копирования класса
Хотя и делал по образцу, но почему то лезет ошибка записи за пределы динамического массива, хотя и...

Ошибка в объявлении класса (в конструкторе)
Я не могу разобраться с классами и конструкторами, в строчке Progect();// {numb=0; sum=0;...

Ошибка в конструкторе класса динамических строк
Необходимо создать класс динамических строк с конструктором копирования, оператором присваивания,...

44
1710 / 1110 / 337
Регистрация: 25.01.2019
Сообщений: 2,910
12.09.2021, 21:47 2
Цитата Сообщение от matviiv Посмотреть сообщение
C++
1
2
3
4
class Book
{
...
    Book *list_of_references = new Book[number];

Самозацикленное бесконечое.
1
429 / 312 / 129
Регистрация: 09.02.2021
Сообщений: 1,096
Записей в блоге: 1
12.09.2021, 21:51  [ТС] 3
Folian, Хмм да теперь понял,только как исправить?Создавать клас Book отдельно и етот клас в Library?
0
1710 / 1110 / 337
Регистрация: 25.01.2019
Сообщений: 2,910
12.09.2021, 21:57 4
Цитата Сообщение от matviiv Посмотреть сообщение
Book отдельно и етот клас в Library?
Да.
1
429 / 312 / 129
Регистрация: 09.02.2021
Сообщений: 1,096
Записей в блоге: 1
13.09.2021, 11:46  [ТС] 5
Folian, Вот сделал через 2 класса,но тоже ошибки,возможно в классах ошибка где-то а может в main не правильно обьявляю как-то,не могли б посмотреть?
Library.cpp:
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
#include "Library.h"
 
void Library::SetList(int n, Book* list)
{
    number = n;
    list_of_references = list;
}
 
Book* Library::GetList()
{
    return list_of_references;
}
 
void Library::ShowList()
{
    for (int i = 0; i < number; i++) {
        list_of_references[i].ShowAuthorAndTitle();
    }
}
 
Library::~Library()
{
    delete[]list_of_references;
}
Book.cpp:
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
#include "Book.h"
 
string Book::GetAuthor()
{
    return author;
}
 
string Book::GetTitle()
{
    return title;
}
 
 
void Book::SetAuthorAndTitle(string a, string t)
{
    author = a;
    title = t;
}
 
void Book::ShowAuthorAndTitle()
{
    cout << author << " " << title << endl;
}
 
 
Book::Book()
{
    author = "No author";
    title = "No title";
}
Library.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#pragma once
#include <iostream>
#include <string>
#include "Book.h"
using namespace std;
class Library
{
private:
    int number ;
    Book* list_of_references = new Book[number];
public:
    void SetList(int n, Book* list);
    Book* GetList();
    void ShowList();
    ~Library();
};
Book.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#pragma once
#include <iostream>
#include <string>
 
using namespace std;
class Book
{
private:
    string author;
    string title;
 
public:
    string GetAuthor();
    string GetTitle();
    void SetAuthorAndTitle(string a, string t);
    void ShowAuthorAndTitle();
    Book();
};
Source.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <string>
#include "Book.h"
#include "Library.h"
 
using namespace std;
int main() {
    Book* b = new Book[2];
    for (int i = 0; i < 2; i++) {
        b[i].SetAuthorAndTitle("Example", "Example");
        b[i].ShowAuthorAndTitle();
    }
    Library l;
        l.SetList(2, b);
        l.ShowList();
    delete[]b;
    return 0;
}
0
Модератор
2841 / 1792 / 932
Регистрация: 16.10.2013
Сообщений: 5,161
Записей в блоге: 15
13.09.2021, 12:20 6
Я думаю вам нужно убрать из заголовочного файла класса Library выделение памяти в 10 строке. Обычно, выделение памяти делается в конструкторе, а ее освобождение в деструкторе (как вы и делаете).
1
Just Do It!
4028 / 2422 / 640
Регистрация: 23.09.2014
Сообщений: 7,806
Записей в блоге: 2
13.09.2021, 12:22 7
Лучший ответ Сообщение было отмечено matviiv как решение

Решение

Цитата Сообщение от matviiv Посмотреть сообщение
только как исправить?
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
/// Library.h:
#pragma once
#include <iostream>
#include <string>
//#include "Book.h"
using namespace std;
 
class Book{};
 
class Library
{
private:
    int number ;
    Book* list_of_references;
public:
    void SetList(int n, Book* list){}
    Book* GetList(){return nullptr;}
    void ShowList(){}
    ~Library(){delete[] list_of_references;}
    Library(int n): number(n), list_of_references(new Book[number]){} ///<<<---!
};
 
///----------------------------------------------------------------------------|
/// Тест.
///----------------------------------------------------------------------------:
int main()
{   Library library(10);
}
1
429 / 312 / 129
Регистрация: 09.02.2021
Сообщений: 1,096
Записей в блоге: 1
13.09.2021, 12:29  [ТС] 8
XLAT, а как тогда заполнить етот список литератури и вивести
0
Модератор
2841 / 1792 / 932
Регистрация: 16.10.2013
Сообщений: 5,161
Записей в блоге: 15
13.09.2021, 12:34 9
Думаю, можно добавить для класса библиотеки такие конструкторы:

C++
1
2
3
4
5
// Library.h
...
Library(int);
Library(int, Book*);
...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Library.cpp
...
Library::Library(int n)
{
    number = n;
    list_of_references = new Book[number];
}
 
Library::Library(int n, Book* list)
{
    number = n;
    list_of_references = new Book[number];
    for (int i = 0; i < number; i++) {
        list_of_references[i] = list[i];
    }
}
...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main() {
    Book* b = new Book[2];
    for (int i = 0; i < 2; i++) {
        b[i].SetAuthorAndTitle("Example", "Example");
        b[i].ShowAuthorAndTitle();
    }
    Library l1(2);
    l1.ShowList();
    
    Library l2(2, b);
    l2.ShowList();
    delete[]b;
    return 0;
}
1
Just Do It!
4028 / 2422 / 640
Регистрация: 23.09.2014
Сообщений: 7,806
Записей в блоге: 2
13.09.2021, 12:49 10
Цитата Сообщение от matviiv Посмотреть сообщение
а как тогда заполнить етот список литератури и вивести
1. добавить метод для ручного ввода в цикле по каждому экземпляру книги.
2. добавить метод для ввода из файла в цикле по каждому экземпляру книги.
3. добавить метод для заполнения рандомными значениями в цикле по каждому экземпляру книги.
4. придумать другие источники, например, из памяти компутера.
0
429 / 312 / 129
Регистрация: 09.02.2021
Сообщений: 1,096
Записей в блоге: 1
13.09.2021, 12:53  [ТС] 11
Я максимально запутался:
Source.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string>
#include "Book.h"
#include "Library.h"
 
using namespace std;
int main() {
    Book* b = new Book[2];
    for (int i = 0; i < 2; i++) {
        b[i].SetAuthorAndTitle("Example", "Example");
        b[i].ShowAuthorAndTitle();
    }
    Library l1(2);
    l1.ShowList();
 
    Library l2(2, b);
    l2.ShowList();
    delete[]b;
    return 0;
}
Library.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#pragma once
#include <iostream>
#include <string>
#include "Book.h"
using namespace std;
class Library
{
private:
    int number ;
    Book* list_of_references = new Book[number];
public:
    void SetList(int n, Book* list);
    Book* GetList() { return nullptr; }
    void ShowList();
    ~Library();
    Library(int n );
    Library(int n, Book*list);
};
Library.cpp:
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
#include "Library.h"
 
void Library::SetList(int n, Book* list)
{
    number = n;
    list_of_references = list;
}
 
Book* Library::GetList()
{
    return nullptr;
}
 
void Library::ShowList()
{
    for (int i = 0; i < number; i++) {
        list_of_references[i];
    }
}
 
Library::~Library()
{
    delete[]list_of_references;
}
 
Library::Library(int n)
{
    number = n;
    list_of_references = new Book[number];
}
 
Library::Library(int n, Book*list)
{
    number = n;
    list_of_references = new Book[number];
    for (int i = 0; i < number; i++) {
        list_of_references[i] = list[i];
    }
}
Book.cpp:
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
#include "Book.h"
 
string Book::GetAuthor()
{
    return author;
}
 
string Book::GetTitle()
{
    return title;
}
 
 
void Book::SetAuthorAndTitle(string a, string t)
{
    author = a;
    title = t;
}
 
void Book::ShowAuthorAndTitle()
{
    cout << author << " " << title << endl;
}
 
 
Book::Book()
{
    author = "No author";
    title = "No title";
}
Book.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#pragma once
#include <iostream>
#include <string>
 
using namespace std;
class Book
{
private:
    string author;
    string title;
 
public:
    string GetAuthor();
    string GetTitle();
    void SetAuthorAndTitle(string a, string t);
    void ShowAuthorAndTitle();
    Book();
}
;

Добавлено через 21 секунду
XLAT, я исправлял код под ваш, и почему-то много ошибок
0
Just Do It!
4028 / 2422 / 640
Регистрация: 23.09.2014
Сообщений: 7,806
Записей в блоге: 2
13.09.2021, 13:01 12
Цитата Сообщение от matviiv Посмотреть сообщение
XLAT, я исправлял код под ваш, и почему-то много ошибок
хм,
я вижу всё тож же самый код:
Цитата Сообщение от matviiv Посмотреть сообщение
Library.h:
...
Book* list_of_references = new Book[number];
исправьте ...
0
429 / 312 / 129
Регистрация: 09.02.2021
Сообщений: 1,096
Записей в блоге: 1
13.09.2021, 13:20  [ТС] 13
XLAT, ну допустим вот:
Library.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#pragma once
#include <iostream>
#include <string>
#include "Book.h"
using namespace std;
class Library
{
private:
    int number ;
    Book* list_of_references;
public:
    void SetList(int n, Book* list);
    Book* GetList() { return nullptr; }
    void ShowList();
    ~Library();
    Library(int n );
    Library(int n, Book*list);
};
Добавлено через 3 минуты
XLAT, а как добавить метод считивание с клавиатури и как еще можно поправить код?
0
Модератор
2841 / 1792 / 932
Регистрация: 16.10.2013
Сообщений: 5,161
Записей в блоге: 15
13.09.2021, 13:28 14
как вариант:

C++
1
2
3
4
// Library.h
...
void fillList();
...
C++
1
2
3
4
5
6
7
8
9
10
// Library.cpp
...
void Library::fillList()
{
    for (int i = 0; i < number; i++) {
        // ввод author для i-ой книги
        // ввод title для i-ой книги
    }
}
...
C++
1
2
3
4
5
// main.cpp
...
Library l1(2);
l1.fillList();
...
0
429 / 312 / 129
Регистрация: 09.02.2021
Сообщений: 1,096
Записей в блоге: 1
13.09.2021, 13:35  [ТС] 15
long399, Видимо немного не так понял:
C++
1
2
3
4
5
6
7
8
9
void Library::FillList()
{
    for (int i = 0; i < number; i++) {
        string a, t;
        cin >> a;
        cin >> t;
        list_of_references[i].SetAuthorAndTitle(a, t);
    }
}
0
Just Do It!
4028 / 2422 / 640
Регистрация: 23.09.2014
Сообщений: 7,806
Записей в блоге: 2
13.09.2021, 13:39 16
Цитата Сообщение от matviiv Посмотреть сообщение
ну допустим вот:
ошибки компиляции есть?

Цитата Сообщение от matviiv Посмотреть сообщение
а как добавить метод считивание с клавиатури
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Library
{
private:
    ...
public:
    void input_user()
    {   auto& p = list_of_references;
        for(size_t i = 0; i < nimber; ++i)
        {   std::getline(std::cin, p[i].author);
            std::getline(std::cin, p[i].title );
        }
    }
    
    void info()
    {   auto& p = list_of_references;
        for(size_t i = 0; i < nimber; ++i)
        {   std::cout << p[i].author << " - " << p[i].title << '\n';
        }
    }
    ...
0
429 / 312 / 129
Регистрация: 09.02.2021
Сообщений: 1,096
Записей в блоге: 1
13.09.2021, 13:42  [ТС] 17
XLAT, ошибок нет, а вот не виводит результат

Добавлено через 1 минуту
XLAT, в вашем коде ошибки на author и title
0
Just Do It!
4028 / 2422 / 640
Регистрация: 23.09.2014
Сообщений: 7,806
Записей в блоге: 2
13.09.2021, 13:50 18
Цитата Сообщение от matviiv Посмотреть сообщение
в вашем коде ошибки на author и title
сделайте их друзьями:
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
#pragma once
#include <iostream>
#include <string>
//#include "Book.h"
using namespace std;
 
class Book
{
    string author;
    string title;
    friend class Library; ///<<<--- Вот так!
 
public:
 
};
 
class Library
{
private:
    int number ;
    Book* list_of_references;
public:
    void input_user()
    {   auto& p = list_of_references;
        for(size_t i = 0; i < number; ++i)
        {   std::getline(std::cin, p[i].author);
            std::getline(std::cin, p[i].title );
        }
    }
 
    void info()
    {   auto& p = list_of_references;
        for(size_t i = 0; i < number; ++i)
        {   std::cout << p[i].author << " - " << p[i].title << '\n';
        }
    }
 
    void SetList(int n, Book* list){}
    Book* GetList(){return nullptr;}
    void ShowList(){}
    ~Library(){auto& p = list_of_references; delete[] list_of_references;}
    Library(int n): number(n), list_of_references(new Book[number]){}
};
 
///----------------------------------------------------------------------------|
/// Тест.
///----------------------------------------------------------------------------:
int main()
{   Library library(2);
            library.input_user();
            library.info      ();
}
Добавлено через 5 минут
c колокольни ооп'а лучше так:
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
#pragma once
#include <iostream>
#include <string>
//#include "Book.h"
using namespace std;
 
class Book
{
    string author;
    string title;
    void input_user()
    {   std::getline(std::cin, author);
        std::getline(std::cin, title );
    }
    void info()
    {   std::cout << author << " - " << title << '\n';
    }
    friend class Library;
 
public:
 
};
 
class Library
{
private:
    int number ;
    Book* list_of_references;
 
public:
    void input_user()
    {   auto& p = list_of_references;
        for(size_t i = 0; i < number; ++i)
        {   p[i].input_user();
        }
    }
 
    void info()
    {   auto& p = list_of_references;
        for(size_t i = 0; i < number; ++i)
        {   p[i].info();
        }
    }
 
    void SetList(int n, Book* list){}
    Book* GetList(){return nullptr;}
    void ShowList(){}
    ~Library(){auto& p = list_of_references; delete[] list_of_references;}
    Library(int n): number(n), list_of_references(new Book[number]){}
};
 
///----------------------------------------------------------------------------|
/// Тест.
///----------------------------------------------------------------------------:
int main()
{   Library library(2);
            library.input_user();
            library.info      ();
}
1
429 / 312 / 129
Регистрация: 09.02.2021
Сообщений: 1,096
Записей в блоге: 1
13.09.2021, 14:14  [ТС] 19
XLAT, а если брать мой код и без друга то никак не исправить?
0
Just Do It!
4028 / 2422 / 640
Регистрация: 23.09.2014
Сообщений: 7,806
Записей в блоге: 2
13.09.2021, 14:21 20
Цитата Сообщение от matviiv Посмотреть сообщение
без друга то никак не исправить?
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
#pragma once
#include <iostream>
#include <string>
//#include "Book.h"
using namespace std;
 
class Book
{
    string author;
    string title;
 
public:
    void input_user()
    {   std::getline(std::cin, author);
        std::getline(std::cin, title );
    }
    void info()
    {   std::cout << author << " - " << title << '\n';
    }
};
 
class Library
{
private:
    int number ;
    Book* list_of_references;
public:
        void input_user()
    {   auto& p = list_of_references;
        for(size_t i = 0; i < number; ++i)
        {   p[i].input_user();
        }
    }
 
    void info()
    {   auto& p = list_of_references;
        for(size_t i = 0; i < number; ++i)
        {   p[i].info();
        }
    }
 
    void SetList(int n, Book* list){}
    Book* GetList(){return nullptr;}
    void ShowList(){}
    ~Library(){auto& p = list_of_references; delete[] list_of_references;}
    Library(int n): number(n), list_of_references(new Book[number]){}
};
 
///----------------------------------------------------------------------------|
/// Тест.
///----------------------------------------------------------------------------:
int main()
{   Library library(2);
            library.input_user();
            library.info      ();
}
кроме того раз у вас уже есть гетеры:
Цитата Сообщение от matviiv Посмотреть сообщение
string GetAuthor();
    string GetTitle();
то можно добавить и сетеры:
C++
1
2
    void SetAuthor();
    void SetTitle();
но я уже добавил:
это в качестве сетера:

C++
1
    void input_user();
0
13.09.2021, 14:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.09.2021, 14:21
Помогаю со студенческими работами здесь

Инициализация шаблонного класса(В конструкторе класса после двоеточия вновь имя класса)
Всем доброго времени суток! Пытаюсь разобраться как работает приведенный мной код. Конкретно,...

Разработайте класс Book, определив второй метод для класса с параметром Book
Разработайте класс Book , определив второй метод для класса с параметром Book. Метод должен...

Ошибка при открытии класса в конструкторе
Подскажите пжлст. Написал форму со всеми объектами и событиями. После создал наследника этого...

С++, delete в деструкторе класса не видит переменные, создаваемые new в конструкторе класса
#include &quot;stdafx.h&quot; #include &quot;iostream&quot; #include &quot;math.h&quot; using namespace std; class fun {...

Как вызвать виртуальную функцию из дочернего класса, если она определена и вызывается в конструкторе РОДИТЕЛЬСКОГО класса?
Ну то есть так: есть родительский и дочерний класс, в родительском определен виртуальная функция и...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru