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

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

Восстановить пароль Регистрация
 
Керра
Модератор
 Аватар для Керра
1270 / 438 / 45
Регистрация: 24.08.2011
Сообщений: 2,123
10.08.2013, 23:27     Конструктор класса не видит конструктор по умолчанию другого класса #1
Ошибка, естественно, в 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.08.2013, 23:27     Конструктор класса не видит конструктор по умолчанию другого класса
Посмотрите здесь:

В конструктор класса передать объект этого класса C++
Вопрос про конструктор класса по умолчанию C++
C++ Создать конструктор копий и оператор присваивания для класса компьютер и члена класса марка
C++ Конструктор класса
C++ Конструктор производного класса требует конструктор предка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
10.08.2013, 23:39     Конструктор класса не видит конструктор по умолчанию другого класса #2
Керра, класс должен быть определен до его использования. Предварительное объявление позволяет лишь объявлять указатели и ссылки в качестве членов класса.

Добавлено через 6 минут
В общем все определения классов переместите в .h файл. Определения функций ( в том числе и конструкторов ) оставляете в .cpp.
Керра
Модератор
 Аватар для Керра
1270 / 438 / 45
Регистрация: 24.08.2011
Сообщений: 2,123
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;
}
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
11.08.2013, 10:33     Конструктор класса не видит конструктор по умолчанию другого класса #4
Керра, деструктор вызывается автоматически, не нужно делать это руками. Иначе в данном случае получается два вызова delete, второй благополучно валится.
Керра
Модератор
 Аватар для Керра
1270 / 438 / 45
Регистрация: 24.08.2011
Сообщений: 2,123
11.08.2013, 10:37  [ТС]     Конструктор класса не видит конструктор по умолчанию другого класса #5
0x10, разве если в классе есть динамические переменные-члены, то не нужно в деструкторе прописывать их удаление?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11828 / 6807 / 769
Регистрация: 27.09.2012
Сообщений: 16,878
Записей в блоге: 2
Завершенные тесты: 1
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 выходит из области видимости и уничтожается. Декструктор вызовется автоматически
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.08.2013, 10:47     Конструктор класса не видит конструктор по умолчанию другого класса
Еще ссылки по теме:

Конструктор класса C++
Конструктор класса по умолчанию: код компилируется, хотя по идее не должен C++
C++ Cделать конструктор по умолчанию и копирования для класса

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

Или воспользуйтесь поиском по форуму:
Керра
Модератор
 Аватар для Керра
1270 / 438 / 45
Регистрация: 24.08.2011
Сообщений: 2,123
11.08.2013, 10:47  [ТС]     Конструктор класса не видит конструктор по умолчанию другого класса #7
Croessmah, а, точно)) спасибо)
Yandex
Объявления
11.08.2013, 10:47     Конструктор класса не видит конструктор по умолчанию другого класса
Ответ Создать тему
Опции темы

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