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

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

Войти
Регистрация
Восстановить пароль
 
unkarjedy
3 / 3 / 0
Регистрация: 13.03.2011
Сообщений: 114
#1

Проблемы с конструктором (вроде) - C++

11.09.2012, 14:35. Просмотров 572. Ответов 10
Метки нет (Все метки)

Недавно перешёл с С на С++.
Есть класс Notebook который использует определённый мной список имён.

list.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
//List.h
 
template <class T> class List;
 
 
template <class T>  class Elem 
{
  friend class List<T>;
  T *data;
  Elem<T> *next;
public:
  Elem<T>  ();
  Elem<T>  (T *t);
  Elem<T>  (T *t, Elem *n);
};
 
 
template <class T> class List
{
  Elem<T> *first; //pointer to the begining of the list
public:
  List<T> ();
  ~List<T> ();
 
  Elem<T>* getFirst ();
  Elem<T>* getNext (Elem<T> *e);
  
  T *getData (Elem<T> *e);
  
  bool empty (){
    return first == 0;
  }
 
  void add (T *t);
  void insert (T *t, Elem<T> *e);
  void removeNext (Elem<T> *e);
  void remove (Elem<T> *e);
};

list.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
//List.cpp
 
#include "list.h"
#include <iostream>
 
using namespace std;
 
//Elem<T> ==========================================
Elem<class T>::Elem<T> (){
  data = 0;
  next = NULL;
}
Elem<class T>::Elem<T> (T *t){
  data = t;
  next = NULL;
}
Elem<class T>::Elem<T> (T *t, Elem *n){
   data = t;
   next = n;
}
 
//List<T> ==========================================
List<class T>::List<T> (){
  first = NULL;
}
List<class T>::~List<T> (){
  if (empty ()) return;
 
  Elem<T> *t = first;
 
  while (t) {
    Elem<T>* tmp = t->next;
    delete t;
    t = tmp;
  }
}
 
 
inline Elem<T>* List<class T>::getFirst (){
  return first;
}
inline Elem<T>* List<class T>::getNext (Elem<T> *e){
  return e->next;
}
 
inline T* List<class T>::getData (Elem<T> *e){
  return e->data;
}
 
void List<class T>::add (T *t){
  if (empty ()){
    Elem<T> *pe = new Elem<T> (t);
    first = pe;
  } else {
    Elem<T> *pe = new Elem<T> (t, first);
    if (!pe){
      cerr<<"Memory shortage!";
      exit(-1);
    }
 
    first = pe;
  }
}
void List<class T>::insert (T *t, Elem<T> *e){
  Elem<T> *tmp = new Elem<T>(t);
  if (!tmp){
      cerr<<"Memory shortage!";
      exit(-1);
  }
  tmp->next = e->next;
  e->next = tmp;
}
void List<class T>::removeNext (Elem<T> *e){
  if(empty()) return;
  Elem<T> *tmp = e->next;
  delete tmp;
}
 
//removes "e" element of the List
//uses "trick" - the element does not removes
//it's content is copied with the content of next element
//and than the next element is deleted
void List<class T>::remove (Elem<T> *e){
  if(empty()) return;
 
  Elem<T> *tmp = e->next;
  e->data = e->next->data;
  e->next = e->next->next;
  delete tmp;
}

В классе Notebook убрал пока все методы, дабы упростить. Где-то ошибка в конструкторе этого класса

notebook.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
#include <string>
#include <string>
#include <stdio.h>
#include "list.h"
 
using namespace std;
 
struct name {
  string first;
  string second;
  string father;
};
 
class Notebook
{
private:
  List<name> records;//();
public:
  Notebook();
  //Notebook(FILE* input);
  ~Notebook();
 
  //void add(name record);
  //void find(char*, char*, char*);
};
 
Notebook::Notebook() : records(){};

ТЕПЕРЬ...Когда я пытаюсь в main.cpp создать объект этого класса:
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include "notebook.h"
 
int main (int argc, char* argv[])
{
  Notebook notebook_1();
 
  return 0;
}
у меня вылазит предупреждение:

warning C4930: 'Notebook notebook_1(void)': prototyped function not called (was a variable definition intended?)

Гууглил, и не понял почему оно вылезло у меня?
Прокоментируйте пожалуйста.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2012, 14:35     Проблемы с конструктором (вроде)
Посмотрите здесь:

Проблемы с конструктором. "отсутствуют экземпляры перегружена функция GradeBook::GradeBook" - C++
// Заголовок GradeBook.h #include &lt;string&gt; using std:: string; class GradeBook { public:

Вроде переполнение, а вроде бы и нет - C++
День добрый! Интересует, почему си не дает мне сделать следующую штуку. int a = 4999998848; cout &lt;&lt; a*2 &lt;&lt; endl; По...

Проблема с конструктором. - C++
Пытаюсь сделать класс список и не получается написать конструктор копирования. header // #include &lt;iostream&gt;; using namespace std; ...

Трабла с конструктором - C++
Компилятор никаких ошибок не выдает, но программа не запускается. using namespace std; class Cpmv { public: struct Info ...

Работа с конструктором - C++
Доброго времени суток. Обращаюсь к вам с двумя проблемами. Во-первых, Code Blocks выдаёт у меня ошибку multiple definition. Связано ли...

Работа с конструктором - C++
Всем доброго времени суток. Получил задание по программированию в универе. Писать задание за меня не прошу, нужно лишь уяснить парочку...

Что-то с конструктором - C++
Задача: написать программу бюджета, есть два типа счета, у каждого свои параметры пополнения и снятия. Место вывода баланса только что...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
11.09.2012, 14:40     Проблемы с конструктором (вроде) #2
Скобки убери за notebook_1.
То что ты написал это прототип функции с сигнатурой (void)->Notebook.
Andsteadur
153 / 137 / 3
Регистрация: 23.05.2009
Сообщений: 275
11.09.2012, 14:43     Проблемы с конструктором (вроде) #3
C++
1
Notebook notebook_1();
Объявление функции notebook_1, возвращающей объект Notebook и не принимающей параметров.

Как уже сказал Герц для объявления объекта класса Notebook с вызовом конструктора по умолчанию следует опустить скобки
unkarjedy
3 / 3 / 0
Регистрация: 13.03.2011
Сообщений: 114
11.09.2012, 14:49  [ТС]     Проблемы с конструктором (вроде) #4
Спасибо, но даже если я убрал скобки в этом месте, то откуда-то вылазят ошибки:

notebook.obj : error LNK2005: "public: __thiscall Notebook::Notebook(void)" (??0Notebook@@QAE@XZ) already defined in main.obj
1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall List<struct name>::List<struct name>(void)" (??0?$List@Uname@@@@QAE@XZ) referenced in function "public: __thiscall Notebook::Notebook(void)" (??0Notebook@@QAE@XZ)
1>notebook.obj : error LNK2001: unresolved external symbol "public: __thiscall List<struct name>::List<struct name>(void)" (??0?$List@Uname@@@@QAE@XZ)
1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall Notebook::~Notebook(void)" (??1Notebook@@QAE@XZ) referenced in function _main
1>C:\Users\uzer\Desktop\ПОЛИТЕХ\Прога 2 семестр\Phone book\Debug\notebook.exe : fatal error LNK1120: 2 unresolved externals
Andsteadur
153 / 137 / 3
Регистрация: 23.05.2009
Сообщений: 275
11.09.2012, 15:27     Проблемы с конструктором (вроде) #5
Не определен деструктор класса Notebook и определение шаблона должно быть в файле, где он объявлен. Итого:

list.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
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
114
115
116
117
#pragma once
#include <iostream>
 
template <class T> class List;
 
 
template <class T>  class Elem 
{
    friend class List<T>;
    T *data;
    Elem<T> *next;
public:
    Elem<T>  ()
    {
        data = 0;
        next = NULL;
    };
 
    Elem<T>  (T *t)
    {
        data = t;
        next = NULL;
    };
 
    Elem<T>  (T *t, Elem<T> *n)
    {
        data = t;
        next = n;
    };
};
 
 
template <class T> class List
{
    Elem<T> *first; //pointer to the begining of the list
public:
    List<T> ()
    {
        first = NULL;
    };
 
    ~List<T> ()
    {
        if (empty ()) return;
 
        Elem<T> *t = first;
 
        while (t) {
            Elem<T>* tmp = t->next;
            delete t;
            t = tmp;
        }
    };
 
    Elem<T>* getFirst ()
    {
        return first;
    };
 
    Elem<T>* getNext (Elem<T> *e)
    {
        return e->next;
    };
 
    T *getData (Elem<T> *e)
    {
        return e->data;
    };
 
    bool empty (){
        return first == 0;
    };
 
    void add (T *t)
    {
        if (empty ()){
            Elem<T> *pe = new Elem<T> (t);
            first = pe;
        } else {
            Elem<T> *pe = new Elem<T> (t, first);
            if (!pe){
                cerr<<"Memory shortage!";
                exit(-1);
            }
 
            first = pe;
        }
    };
 
    void insert (T *t, Elem<T> *e)
    {
        Elem<T> *tmp = new Elem<T>(t);
        if (!tmp){
            cerr<<"Memory shortage!";
            exit(-1);
        }
        tmp->next = e->next;
        e->next = tmp;
    };
 
    void removeNext (Elem<T> *e)
    {
        if(empty()) return;
        Elem<T> *tmp = e->next;
        delete tmp;
    };
 
    void remove (Elem<T> *e)
    {
        if(empty()) return;
 
        Elem<T> *tmp = e->next;
        e->data = e->next->data;
        e->next = e->next->next;
        delete tmp;
    };
};


notebook.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
include "list.h"
#include <string>
 
using std::string;
 
struct sName {
    string first;
    string second;
    string father;
    sName(string s1, string s2, string s3):first(s1), second(s2), father(s3){}
};
 
class Notebook
{
private:
    List<int> records;//();
public:
    Notebook();
    ~Notebook();
};
 
Notebook::Notebook(){}
Notebook::~Notebook(){}


C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include "notebook.h"
 
int main (int argc, char* argv[])
{
  Notebook notebook_1;
 
  return 0;
}
-=ЮрА=-
Заблокирован
Автор FAQ
11.09.2012, 15:33     Проблемы с конструктором (вроде) #6
unkarjedy, ответил в твоей темеДебаг тупит
unkarjedy
3 / 3 / 0
Регистрация: 13.03.2011
Сообщений: 114
11.09.2012, 16:42  [ТС]     Проблемы с конструктором (вроде) #7
Спасибо.

Добавлено через 5 минут
Можно ещё уточнение: если я только объвил шаблон класса List а определяю его чуть ниже(чтобы было более "смотрибельно") :

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
template <class T> class List
{
  Elem<T> *first; //pointer to the begining of the list
public:
  List<T> ();
  ~List<T> ();
 
  Elem<T>* getFirst ();
  Elem<T>* getNext (Elem<T> *e);
  
  T *getData (Elem<T> *e);
  
  bool empty (){
    return first == 0;
  }
 
  void add (T *t);
  void insert (T *t, Elem<T> *e);
  void removeNext (Elem<T> *e);
  void remove (Elem<T> *e);
};
 
//Elem<T> ==========================================
Elem<class T>::Elem<T> (){
  data = 0;
  next = NULL;
}
Elem<class T>::Elem<T> (T *t){
  data = t;
  next = NULL;
}
Elem<class T>::Elem<T> (T *t, Elem *n){
   data = t;
   next = n;
}
 
//List<T> ==========================================
List<class T>::List<T> (){
  first = NULL;
}
List<class T>::~List<T> (){
  if (empty ()) return;
 
  Elem<T> *t = first;
 
  while (t) {
    Elem<T>* tmp = t->next;
    delete t;
    t = tmp;
  }
}
 
 
inline Elem<T>* List<class T>::getFirst (){
  return first;
}
inline Elem<T>* List<class T>::getNext (Elem<T> *e){
  return e->next;
}
 
inline T* List<class T>::getData (Elem<T> *e){
  return e->data;
}
 
void List<class T>::add (T *t){
  if (empty ()){
    Elem<T> *pe = new Elem<T> (t);
    first = pe;
  } else {
    Elem<T> *pe = new Elem<T> (t, first);
    if (!pe){
      cerr<<"Memory shortage!";
      exit(-1);
    }
 
    first = pe;
  }
}
void List<class T>::insert (T *t, Elem<T> *e){
  Elem<T> *tmp = new Elem<T>(t);
  if (!tmp){
      cerr<<"Memory shortage!";
      exit(-1);
  }
  tmp->next = e->next;
  e->next = tmp;
}
void List<class T>::removeNext (Elem<T> *e){
  if(empty()) return;
  Elem<T> *tmp = e->next;
  delete tmp;
}
 
//removes "e" element of the List
//uses "trick" - the element does not removes
//it's content is copied with the content of next element
//and than the next element is deleted
void List<class T>::remove (Elem<T> *e){
  if(empty()) return;
 
  Elem<T> *tmp = e->next;
  e->data = e->next->data;
  e->next = e->next->next;
  delete tmp;
}

то вылазит куча предупреждений к каждому из объявлений, наподобие:

warning C4812: obsolete declaration style: please use 'Elem<T>::Elem' instead

То есть я пишу:

Elem<class T>::Elem... и он ругается на это. Как быть?
Andsteadur
153 / 137 / 3
Регистрация: 23.05.2009
Сообщений: 275
11.09.2012, 16:43     Проблемы с конструктором (вроде) #8
C++
1
2
3
template <class T>
Elem<T>::Elem()
{...}
unkarjedy
3 / 3 / 0
Регистрация: 13.03.2011
Сообщений: 114
11.09.2012, 16:53  [ТС]     Проблемы с конструктором (вроде) #9
Спасибо

Добавлено через 8 минут
Получается template <class T> нужно вставлять перед каждым объявлением???
Andsteadur
153 / 137 / 3
Регистрация: 23.05.2009
Сообщений: 275
11.09.2012, 16:55     Проблемы с конструктором (вроде) #10
Так точно
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2012, 20:00     Проблемы с конструктором (вроде)
Еще ссылки по теме:

Ошибки с конструктором по умолчанию - C++
Пишу консольную игру, что-то вроде острова сокровищ, но не могу исправить пару ошибок с конструктором по умолчанию(error C2512) =( кто...

Присваивание конструктором копирования - C++
Всем форумчанам привет. Я совсем недавно изучаю с++. Помогите плиз понять. К примеру вот такой код: #include &lt;iostream.h&gt; int...

Ввод данных с конструктором - C++
Всем привет, новичок в с++ и возникла проблема. Вот рабочий код: #include &lt;iostream&gt; using namespace std; class Student { ...

Проблеммка с конструктором копирования - C++
В общем суть: /*Создать класс - одномерный массив целых чисел (вектор). Функции-члены обращаются к отдельному элементу массива, вывода...

Необходимо разобраться с конструктором! - C++
class Complex { public: // Конструктор по умолчанию // (в данном случае является также и конструктором преобразования) ...


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

Или воспользуйтесь поиском по форуму:
unkarjedy
3 / 3 / 0
Регистрация: 13.03.2011
Сообщений: 114
11.09.2012, 20:00  [ТС]     Проблемы с конструктором (вроде) #11
Можешь ещё помочь...

Код тот же, но теперь я внизу определяю

C++
1
2
3
4
5
6
7
8
void Notebook::add(sName *newName){
  if(records.isEmpty()) {
    add(newName);
    return;
  } 
  Elem<sName> *elem = records.getFirst(); //здесь вроде всё правильно, а ругаетя именно на эту строку
  //sName *name = records.getData(elem);
}
и откуда ошибка теперь:


1>main.obj : error LNK2019: unresolved external symbol "public: class Elem<struct sName> * __thiscall List<struct sName>::getFirst(void)" (?getFirst@?$List@UsName@@@@QAEPAV?$Elem@UsName@@@@XZ) referenced in function "public: void __thiscall Notebook::add(struct sName *)" (?add@Notebook@@QAEXPAUsName@@@Z)

Добавлено через 21 минуту

Добавлено через 54 секунды
PAUsName@@@Z)
Yandex
Объявления
11.09.2012, 20:00     Проблемы с конструктором (вроде)
Ответ Создать тему
Опции темы

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