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

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

Войти
Регистрация
Восстановить пароль
 
MayaNash
1285 / 453 / 47
Регистрация: 24.08.2011
Сообщений: 2,214
#1

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

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

Конструктор класса с инициализацией другого класса - C++
error C2064: term does not evaluate to a function taking 6 arguments Так же при наведении на SStria(...); Пишет: call of an object of...

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

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

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

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

Пример класса с конструктором и деструктором, создание экземпляра класса через конструктор с параметрами - C++
Привести пример класса с конструктором и деструктором, созданием экземпляра класса с помощью конструктора с параметрами.

6
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
10.08.2013, 23:39 #2
Керра, класс должен быть определен до его использования. Предварительное объявление позволяет лишь объявлять указатели и ссылки в качестве членов класса.

Добавлено через 6 минут
В общем все определения классов переместите в .h файл. Определения функций ( в том числе и конструкторов ) оставляете в .cpp.
1
MayaNash
1285 / 453 / 47
Регистрация: 24.08.2011
Сообщений: 2,214
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
0x10
2480 / 1655 / 248
Регистрация: 24.11.2012
Сообщений: 4,100
11.08.2013, 10:33 #4
Керра, деструктор вызывается автоматически, не нужно делать это руками. Иначе в данном случае получается два вызова delete, второй благополучно валится.
1
MayaNash
1285 / 453 / 47
Регистрация: 24.08.2011
Сообщений: 2,214
11.08.2013, 10:37  [ТС] #5
0x10, разве если в классе есть динамические переменные-члены, то не нужно в деструкторе прописывать их удаление?
0
Croessmah
Ушел
Эксперт CЭксперт С++
13554 / 7705 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 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 выходит из области видимости и уничтожается. Декструктор вызовется автоматически
1
MayaNash
1285 / 453 / 47
Регистрация: 24.08.2011
Сообщений: 2,214
11.08.2013, 10:47  [ТС] #7
Croessmah, а, точно)) спасибо)
0
11.08.2013, 10:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.08.2013, 10:47
Привет! Вот еще темы с ответами:

Создать конструктор копий и оператор присваивания для класса компьютер и члена класса марка - C++
Создать конструктор копий и оператор присваивания для класса компьютер и члена класса марка. Всем огромное спасибо за помощь! |

В конструктор класса передать объект этого класса - C++
Вопрос на засыпку :) Как в конструктор класса передать объект этого класса? Т.е. class A { public: A(const char* s){} ...

Для класса "R" не существует конструктор по умолчанию - C++
Подскажите, что не так. И как здесь пользоваться cout? Чтобы вывести с. Просто я вбивал, а он не работает. И где его вообще вбивать нужно? ...

Будет ли определен компилятором конструктор по умолчанию, если есть конструктор с дефолтным параметром? - C++
Добрый день, сразу к делу, есть некий класс class some { int x; public: some(int y = 1) : x(y) {} };


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

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

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