Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
2 / 2 / 0
Регистрация: 31.10.2013
Сообщений: 81
1

Ошибка multiple defenition

07.04.2019, 01:00. Показов 2602. Ответов 23
Метки нет (Все метки)

Всем привет, тема заезженная, но так и не нашёл решения.
Ниже простой код. но при компиляции получаю ошибку multiple defenition of Point::first(и last) .bss+0x0 и .bss+0x8. Может я что то упустил. Окажите посильную помощь

Кликните здесь для просмотра всего текста
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
#include <iostream>
using namespace std;
 
//################### Class Deffinition ###########################
class Point
{
private:
   static Point *first;
   static Point *last;
   int x, y;
   Point* next;
   Point* prev;
 
public:
 
    Point(int, int);
    int GetX(){return x;}
    int GetY(){return y;}
    void SetX(int);
    void SetY(int);
    void print(){std::cout << "X: "<< x << "\nY: " << y << std::endl;}
    static void print_all();
 
 
};
Point* Point::first  = nullptr;
Point* Point::last = nullptr;
//#########################Class deffinition###################
 
 
 
//##################### Class realisation ###########################
/*Point::Point(int _x, int _y)
{
   if(first == nullptr && nullptr == last)
    {
        first = this;
        last=this;
        this->next = nullptr;
        this->last = nullptr;
    }
    else {
        this->prev = last;
        this->next = nullptr;
        last->next = this;
        last = this;
    }
 
    x=_x; y=_y;
 
 
 
}
void Point::print_all()
{
    Point * current = first;
    while (current->next)
    {
        current->print();
        std::cout << std::endl;
        current = current->next;
    }
}
void Point::SetX(int _x){x= _x;}
void Point::SetY(int _y){y = _y;}*/
//################################################### end realisation #######################3
int main()
{
    for (int i=0; i < 5; i++ )
    {
        int x,y;
        cout << "Введите Х: " ; cin >> x;
        cout << "Введите Y: " ; cin >> y;
        //new Point(x,y);
    }
    //Point::print_all();
    return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.04.2019, 01:00
Ответы с готовыми решениями:

Ошибка multiple definition
В строке 4 компилятор выдает ошибку &quot;multiple definition of 'fin'&quot;. Проблема в том, что в этой...

Ошибка в классе - multiple types
Изучаю связанные списки указателей. Написал список по той же структуре, как и в книге. Ошибка...

Ошибка multiple definition при сборке в QT Creator
Через консоль (c помощью g++) программа компилируется и запускается без ошибок В QT Creator не...

Ошибка multiple definition of main при наследовании
Всем привет. Проблема описана много где в интернете , но я так и не смог понять в чём косяк у...

23
nd2
3422 / 2802 / 1252
Регистрация: 29.01.2016
Сообщений: 9,426
07.04.2019, 01:33 2
Весь код в одном файле? Если нет, то вот это перенеси из .h в .cpp:
C++
1
2
Point* Point::first  = nullptr;
Point* Point::last = nullptr;
0
Продавец времени
6453 / 3451 / 800
Регистрация: 12.03.2015
Сообщений: 16,485
07.04.2019, 01:39 3
Попробуй сам себе (не мне, а себе!) по-русски, своими словами объяснить, что тут происходит?

Ошибка multiple defenition
0
2 / 2 / 0
Регистрация: 31.10.2013
Сообщений: 81
07.04.2019, 02:18  [ТС] 4
Весь код в одном файле? Если нет, то вот это перенеси из .h в .cpp:
C++
в данном случае да.
Verevkin
Попробуй сам себе (не мне, а себе!) по-русски, своими словами объяснить, что тут происходит?
Ссылки на первый и последний объект этого класса. в классе пытаюсь реализовать список его объектов. что бы правильно создать первый объект мне нужно что бы ссылки были нулевыми или, пустыми или, ссылались на нул, ну или как угодно.
0
nd2
3422 / 2802 / 1252
Регистрация: 29.01.2016
Сообщений: 9,426
07.04.2019, 02:24 5
Цитата Сообщение от Stazot Посмотреть сообщение
в данном случае да.
Там, где ошибку выдаёт, весь код в одном файле?
0
nd2
3422 / 2802 / 1252
Регистрация: 29.01.2016
Сообщений: 9,426
07.04.2019, 02:24 6
Удалил.
0
2 / 2 / 0
Регистрация: 31.10.2013
Сообщений: 81
07.04.2019, 02:26  [ТС] 7
Что самое странное что пока не создал первого объекта, нормально компилировалось. Как только создал экземпляр сразу грохнулось. При чем если в дальнейшем за комментировать создание объекта все равно не компилируется

Добавлено через 1 минуту
Там, где ошибку выдаёт, весь код в одном файле?
Да, вот то что я прислал это листинг одного файла.
0
nd2
3422 / 2802 / 1252
Регистрация: 29.01.2016
Сообщений: 9,426
07.04.2019, 02:44 8
Цитата Сообщение от Stazot Посмотреть сообщение
Да, вот то что я прислал это листинг одного файла.
Я вижу, что это листинг одного файла. Он у тебя в проекте один?

Добавлено через 11 минут
Реализации класса зачем закомментировал? Выложенный код никаких ошибок не выдаёт.
0
2 / 2 / 0
Регистрация: 31.10.2013
Сообщений: 81
07.04.2019, 02:49  [ТС] 9
Цитата Сообщение от nd2 Посмотреть сообщение
Выложенный код никаких ошибок не выдаёт.
В винде попробовал, тоже не выдаёт, но не работает корректно. Мне кажется что то с компилятором g++, проект я создавал проект в QtCreator, пробовал в Codeblock та же проблема. Как правильно настроить Clang в Qt не знаю к сожалению
0
зомбяк
1556 / 1195 / 339
Регистрация: 14.05.2017
Сообщений: 3,883
07.04.2019, 06:25 10
Лучший ответ Сообщение было отмечено Stazot как решение

Решение

В 40 строке ошибка. Там должно быть this->prev а не this->last

Добавлено через 5 минут
И в print'е должно быть для распечатки всего списка
while (current)

И ещё статическую функцию, которая бы всё это очищала из памяти, надо бы. А то утечка будет.

Добавлено через 2 минуты
Касательно multiple definition - возможно аналогия с http://www.cplusplus.com/forum/beginner/121441/

Добавлено через 18 минут
Одним файлом оно компилируется и работает в gcc - https://rextester.com/MOCU80992

Добавлено через 10 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
void Point::delete_all()
{
    Point * current = first;
    first = nullptr;
    while (current)
    {
        Point * tmp_current = current;
        current = current->next;
        delete tmp_current;
    }
    last = nullptr;
}
1
2 / 2 / 0
Регистрация: 31.10.2013
Сообщений: 81
07.04.2019, 11:16  [ТС] 11
Разделил на три файла в Винде
Main
x
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "point.h"
using namespace std;
 
int main()
{    
    for (int i=0; i < 5; i++ )
    {
        int x,y;
        cout << "Enter X: " ; cin >> x;
        cout << "Enter Y: " ; cin >> y;
        new Point(x,y);
    }
 
    Point::print_all();
 
    return 0;
}

point.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
#ifndef POINT_H
#define POINT_H
#include <iostream>
//################### Class Deffinition ###########################
class Point
{
private:
   static Point *first;
   static Point *last;
   int x, y;
   Point* next;
   Point* prev;
 
public:
 
    Point(int, int);
    int GetX(){return x;}
    int GetY(){return y;}
    void SetX(int);
    void SetY(int);
    void print(){std::cout << "X: "<< x << "\nY: " << y << std::endl;}
    static void print_all();
 
 
};
Point* Point::first  = nullptr;
Point* Point::last = nullptr;
//#########################Class deffinition###################
 
#endif // POINT_H

point.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
#include "point.h"
 
//##################### Class realisation ###########################
Point::Point(int _x, int _y)
{
   if(first == nullptr && nullptr == last)
    {
        first = this;
        last=this;
        this->next = nullptr;
        this->last = nullptr;
    }
    else {
        this->prev = last;
        this->next = nullptr;
        last->next = this;
        last = this;
    }
 
    x=_x; y=_y;
 
 
 
}
void Point::print_all()
{
    Point * current = first;
    while (current->next)
    {
        current->print();
        std::cout << std::endl;
        current = current->next;
    }
}
void Point::SetX(int _x){x= _x;}
void Point::SetY(int _y){y = _y;}

И тут снова эта проблема. Компилятор MinGW

Добавлено через 28 секунд
Цитата Сообщение от TRam_ Посмотреть сообщение
В 40 строке ошибка. Там должно быть this->prev а не this->last
Это увидел, исправилю Спасибо
0
nd2
3422 / 2802 / 1252
Регистрация: 29.01.2016
Сообщений: 9,426
07.04.2019, 11:49 12
Цитата Сообщение от Stazot Посмотреть сообщение
И тут снова эта проблема.
Читай 2-й пост.
0
2 / 2 / 0
Регистрация: 31.10.2013
Сообщений: 81
07.04.2019, 11:55  [ТС] 13
Почитал статью которую вы мне дали, к сожалению ответа не нашёл, думаю придется логическую в качестве флага поставить. :-(

Добавлено через 2 минуты
Цитата Сообщение от nd2 Посмотреть сообщение
Читай 2-й пост.
Написал же что сейчас как положено разделил на три файла, там каждый спойлер это листинг конкретного файла
0
nd2
3422 / 2802 / 1252
Регистрация: 29.01.2016
Сообщений: 9,426
07.04.2019, 11:59 14
Лучший ответ Сообщение было отмечено Stazot как решение

Решение

Цитата Сообщение от Stazot Посмотреть сообщение
Написал же что сейчас как положено разделил на три файла, там каждый спойлер это листинг конкретного файла
Ты что, читать не умеешь?
Цитата Сообщение от nd2 Посмотреть сообщение
Весь код в одном файле? Если нет, то вот это перенеси из .h в .cpp:
C++
1
2
Point* Point::first = nullptr;
Point* Point::last = nullptr;
1
2 / 2 / 0
Регистрация: 31.10.2013
Сообщений: 81
07.04.2019, 12:27  [ТС] 15
В общем может я изначально не много не правильно понял. В общем переносил я инициализацию в конец файла реализации в point.cpp и не работало. Попробовал в самое начало перенести, до реализации всего остального, и нормально с компилировалось.
0
nd2
3422 / 2802 / 1252
Регистрация: 29.01.2016
Сообщений: 9,426
07.04.2019, 12:34 16
Цитата Сообщение от Stazot Посмотреть сообщение
В общем переносил я инициализацию в конец файла реализации в point.cpp и не работало.
Сказки.
1
2 / 2 / 0
Регистрация: 31.10.2013
Сообщений: 81
07.04.2019, 12:35  [ТС] 17
Цитата Сообщение от TRam_ Посмотреть сообщение
И ещё статическую функцию, которая бы всё это очищала из памяти, надо бы. А то утечка будет.
Это тестовый код для отработки алгоритма. Нужно будет удалять конкретный объект, по этому поводу совета искал вот тут
0
зомбяк
1556 / 1195 / 339
Регистрация: 14.05.2017
Сообщений: 3,883
07.04.2019, 13:47 18
Цитата Сообщение от Stazot Посмотреть сообщение
Нужно будет удалять конкретный объект
Если нужен конкретный объект, то пользоваться static - переменными и функциями нельзя. А нужно всё это переводить на локальные переменные, а значит от используемого тобой метода добавления новых элементов с помощью конструктора - отказаться.

Добавлено через 1 минуту
Нужен отдельный класс, который бы инкапсулировал в себе собственно список с Point'ами
0
2 / 2 / 0
Регистрация: 31.10.2013
Сообщений: 81
07.04.2019, 16:02  [ТС] 19
Цитата Сообщение от TRam_ Посмотреть сообщение
Если нужен конкретный объект, то пользоваться static - переменными и функциями нельзя. А нужно всё это переводить на локальные переменные, а значит от используемого тобой метода добавления новых элементов с помощью конструктора - отказаться.
А если статический метод который параметром принимает ссылку на объект, перекидывает ссылки, и удаляет его?
0
зомбяк
1556 / 1195 / 339
Регистрация: 14.05.2017
Сообщений: 3,883
07.04.2019, 16:24 20
Stazot, можно использовать для этих целей вовсе внешнюю функцию. Но с точки зрения ООП тут намного лучше видится именно метод класса.

Но в любом случае использовать
C++
1
2
   static Point *first;
   static Point *last;
для этих целей нельзя, они должны быть собственными полями каждого экземпляра списка.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.04.2019, 16:24

получить все записи из <select multiple='multiple'
как через JQUERY получить все записи из &lt;select multiple='multiple'

Ошибка multiple definition
Ошибка multiple definition of `SocketTest::bytesWritten(long long)' подскажите в чем проблема ...

Ошибка Multiple declaration for
Всем привет. Ребята проблема такая. Я (конечно не сам мне помогли) к проекту прикрутил сорцы от...

Ошибка multiple definition of `Start'
так объявляю этот старт, на который ругается: void **Start В конструкторе формы делаю так:...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru