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

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

Восстановить пароль Регистрация
 
unkarjedy
3 / 3 / 0
Регистрация: 13.03.2011
Сообщений: 114
11.09.2012, 14:35     Проблемы с конструктором (вроде) #1
Недавно перешёл с С на С++.
Есть класс 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?)

Гууглил, и не понял почему оно вылезло у меня?
Прокоментируйте пожалуйста.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
11.09.2012, 14:40     Проблемы с конструктором (вроде) #2
Скобки убери за notebook_1.
То что ты написал это прототип функции с сигнатурой (void)->Notebook.
Andsteadur
152 / 136 / 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
152 / 136 / 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
152 / 136 / 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
152 / 136 / 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++ Трабла с конструктором
C++ Непонятки с конструктором копирования
C++ Вроде переполнение, а вроде бы и нет

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

Или воспользуйтесь поиском по форуму:
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     Проблемы с конструктором (вроде)
Ответ Создать тему
Опции темы

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