Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
1294 / 465 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
1

Конструктор класса не видит конструктор по умолчанию другого класса

10.08.2013, 23:27. Просмотров 1564. Ответов 6
Метки нет (Все метки)

Ошибка, естественно, в Classes.cpp, в строке 20. Ругается, что у класса TailNode нет конструктора по умолчанию, хотя он там, конечно, есть.
Classes.h
C++
1
2
3
4
class Node;
class HeadNode;
class InternalNode;
class TailNode;

Classes.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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include "stdafx.h"
#include <iostream>
#include "Classes.h"
using namespace std;
 
class Node
{
public:
    Node() { };
    virtual ~Node() { };
    virtual void Show() = 0;
    virtual Node * Insert(int) = 0;
};
 
class HeadNode: public Node
{
private:
    Node * next;
public:
    HeadNode() { next = new TailNode; };
    ~HeadNode() { next->~Node(); };
    Node * Insert(int theValue) { next = next->Insert(theValue); };
    void Show() { next->Show(); };
};
 
class InternalNode: public Node
{
private:
    Node * next;
    int value;
public:
    InternalNode() { };
    InternalNode(int theValue, Node * theNext): value(theValue), next(theNext) { };
    ~InternalNode() { next->~Node(); };
    Node * Insert(int);
    void Show() { cout << value << " "; };
};
 
Node * InternalNode::Insert(int theValue)
{
    if (theValue <= value)
    {
        Node * newNode = new InternalNode(theValue,this);
        return newNode;
    }
    else
    {
        next = next->Insert(theValue);
        return this;
    }
    return this;
};
 
class TailNode: public Node
{
public:
    TailNode() { };
    ~TailNode() { };
    Node * Insert(int);
    void Show() { };
};
 
Node * TailNode::Insert(int theValue)
{
    Node * newNode = new InternalNode(theValue,this);
    return newNode;
};

Список.cpp
C++
1
2
3
4
5
6
7
8
9
10
#include "stdafx.h"
#include <iostream>
#include "Classes.h"
using namespace std;
 
int main()
{
    HeadNode myList;
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.08.2013, 23:27
Ответы с готовыми решениями:

Конструктор класса с инициализацией другого класса
error C2064: term does not evaluate to a function taking 6 arguments Так же при наведении на ...

Вопрос про конструктор класса по умолчанию
http://s2.ipicture.ru/uploads/20111029/A7AtbNYV.jpg Пункт первый не могу немного понять.Т.е...

Для класса не существует конструктор по умолчанию
Ошибка (активно) E0291 для класса &quot;Apteka&quot; не существует конструктор по умолчанию Хотел посмотреть...

Cделать конструктор по умолчанию и копирования для класса
Вот у меня класс строка: class strg { char *str; int len; public: strg(); strg(const...

6
1172 / 885 / 94
Регистрация: 03.08.2011
Сообщений: 2,455
10.08.2013, 23:39 2
Керра, класс должен быть определен до его использования. Предварительное объявление позволяет лишь объявлять указатели и ссылки в качестве членов класса.

Добавлено через 6 минут
В общем все определения классов переместите в .h файл. Определения функций ( в том числе и конструкторов ) оставляете в .cpp.
1
1294 / 465 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
11.08.2013, 10:31  [ТС] 3
Toshkarik, ага... сейчас попробуем...

Добавлено через 2 минуты
а, не, уже завтра попробуем)) спать надо))

Добавлено через 10 часов 4 минуты
Toshkarik, сработало)

Добавлено через 39 минут
Теперь в Classes.cpp ошибка в строке 101 - Access violation reading...
Classes.h
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
class Node
{
public:
    Node();
    virtual ~Node();
    virtual void Show() = 0;
    virtual Node * Insert(int) = 0;
};
 
class HeadNode: public Node
{
private:
    Node * next;
public:
    HeadNode();
    ~HeadNode();
    Node * Insert(int theValue);
    void Show();
};
 
class InternalNode: public Node
{
private:
    Node * next;
    int value;
public:
    InternalNode();
    InternalNode(int theValue, Node * theNext);
    ~InternalNode();
    Node * Insert(int);
    void Show();
};
 
class TailNode: public Node
{
public:
    TailNode();
    ~TailNode();
    Node * Insert(int);
    void Show() { };
};
 
class List
{
private:
    HeadNode * head;
public:
    List();
    ~List();
    void ShowAll();
    void Insert(int theValue);
};

Classes.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
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include "stdafx.h"
#include <iostream>
#include "Classes.h"
using namespace std;
 
Node::Node()
{ 
    cout << "Node constructor...\n";
};
 
Node::~Node()
{ 
    cout << "Node destructor...\n"; 
};
 
HeadNode::HeadNode() 
{
    next = new TailNode; 
    cout << "HeadNode constructor...\n";
};
 
HeadNode::~HeadNode() 
{ 
    delete next;
    cout << "HeadNode destructor...\n";
};
 
Node * HeadNode::Insert(int theValue)
{
    next = next->Insert(theValue); 
    return this;
};
 
void HeadNode::Show()
{ 
    next->Show(); 
};
 
InternalNode::InternalNode()
{ 
    cout << "InternalNode constructor nr.1...\n"; 
};
 
InternalNode::InternalNode(int theValue, Node * theNext)
{ 
    value = theValue;
    next = theNext;
    cout << "InternalNode constructor nr.2...\n"; 
}
 
InternalNode::~InternalNode()
{ 
    delete next;
    cout << "InternalNode destructor...\n";
};
 
void InternalNode::Show()
{ 
    cout << value << " "; 
};
 
Node * InternalNode::Insert(int theValue)
{
    if (theValue <= value)
    {
        Node * newNode = new InternalNode(theValue,this);
        return newNode;
    }
    else
    {
        next = next->Insert(theValue);
        return this;
    }
    return this;
};
 
TailNode::TailNode()
{ 
    cout << "TailNode constructor...\n"; 
};
 
TailNode::~TailNode()
{ 
    cout << "TailNode destructor...\n"; 
};
 
Node * TailNode::Insert(int theValue)
{
    Node * newNode = new InternalNode(theValue,this);
    return newNode;
};
 
List::List()
{
    head = new HeadNode;
    cout << "List constructor...\n";
};
 
List::~List()
{
    delete head;
    cout << "List destructor...\n";
};
 
void List::ShowAll()
{
    head->Show();
};
 
void List::Insert(int theValue)
{
    head->Insert(theValue);
};

Список.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include "stdafx.h"
#include <iostream>
#include "Classes.h"
using namespace std;
 
int main()
{
    List myList;
    myList.~List();
    system("pause");
    return 0;
}
0
3239 / 2047 / 350
Регистрация: 24.11.2012
Сообщений: 4,896
11.08.2013, 10:33 4
Керра, деструктор вызывается автоматически, не нужно делать это руками. Иначе в данном случае получается два вызова delete, второй благополучно валится.
1
1294 / 465 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
11.08.2013, 10:37  [ТС] 5
0x10, разве если в классе есть динамические переменные-члены, то не нужно в деструкторе прописывать их удаление?
0
Don't worry, be happy
16956 / 9832 / 1895
Регистрация: 27.09.2012
Сообщений: 24,382
Записей в блоге: 2
11.08.2013, 10:43 6
Цитата Сообщение от Керра Посмотреть сообщение
0x10, разве если в классе есть динамические переменные-члены, то не нужно в деструкторе прописывать их удаление?
Имеется ввиду то, что Вы явно вызываете деструктор для автоматической переменной
C++
1
2
3
4
5
6
7
int main()
{
    List myList;//<-- объект создан на "стеке функции"
    //Явный вызов деструктора здесь UB
    system("pause");
    return 0;
}//Конец main, переменная myList выходит из области видимости и уничтожается. Декструктор вызовется автоматически
1
1294 / 465 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
11.08.2013, 10:47  [ТС] 7
Croessmah, а, точно)) спасибо)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.08.2013, 10:47

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Передача unique_ptr в конструктор другого класса
Как нужно передать unique_ptr в конструктор др. класса? есть такой код: .h файл: class...

Конструктор класса, конструктор копирования запускается не тот который нужен
Есть такой конструктор: Neuron::Neuron(int iType_activation_funk) { this-&gt;iType_act =...

Конструктор класса по умолчанию: код компилируется, хотя по идее не должен
#include &lt;iostream&gt; class A {}; int main() { A i; A j(i); return 0;

Конструктор производного класса требует конструктор предка
Выдаёт вот такую вот ошибку: no matching function for call to 'Cube::Cube()' class Cube {...


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

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

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