Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
GPU
0 / 0 / 0
Регистрация: 13.03.2016
Сообщений: 4
#1

Разделение класса со статической переменной в многофайловом проекте - C++

29.07.2016, 10:17. Просмотров 230. Ответов 10
Метки нет (Все метки)

На ровном месте происходят какие-то непонятные чудеса, как будто бы я шаблонный класс объявляю - если реализация класса находится в заголовочном файле, то всё хорошо, но если я её перенесу в .срр, то у компилятора возникает внезапная слепота и он выдаёт ошибку "неопределённая ссылка на конструктор/метод/и т.п.". В чём жопа-то? Раньше такого не происходило. Это у меня проблемы с IDE/компилятором или всё-таки в программе?

Собирал в CodeBlocks.

class.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
#include <iostream>
 
using namespace std;
 
class justclass {
 
    static size_t count;
 
    double douf;
       int intf;
 
public:
 
    justclass();
    justclass(double a,int b);
    justclass(const justclass& ob);
    ~justclass();
 
    size_t which();
 
    friend
    istream& operator>>(istream&,justclass&);
 
    friend
    ostream& operator<<(ostream&,justclass);
};
class.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
#include "class.h"
 
    size_t justclass::count;
 
    justclass::justclass(): douf(0), intf(0)
    {
        ++count;
    }
 
    justclass::justclass(double a,int b): douf(a), intf(b)
    {
        ++count;
    }
 
    justclass::justclass(const justclass& ob)
    {
        douf=ob.douf;
        intf=ob.intf;
 
        ++count;
    }
 
    justclass::~justclass()
    {
        --count;
    }
 
    size_t justclass::which()
    {
        return count;
    }
 
 
    istream& operator>>(istream& inp,justclass& ref)
    {
        inp>>ref.douf>>ref.intf; return inp;
    }
 
    ostream& operator<<(ostream& out,justclass cop)
    {
        out<<cop.douf<<' '<<cop.intf<<endl; return out;
    }
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include "class.h"
 
using namespace std;
 
int main()
{
    justclass a,b;
    cin>>a>>b;
 
    cout<<a<<b<<a.which();
    return 0;
}
Выдаёт ошибку "undefined reference to `justclass::justclass()'", например. Т.е. как будто реализации конструктора нет. Но если я помещу всё в .h, то всё работает. Втф?

п.с. Заранее спасибо за помощь.
http://www.cyberforum.ru/cpp-beginners/thread628674.html
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2016, 10:17
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Разделение класса со статической переменной в многофайловом проекте (C++):

Классы: как из статического метода обратиться к статической переменной класса
Классы: как из статического метода обратиться к статической переменной класса

Struct в многофайловом проекте
Если в main файле создать структуру, то как её использовать в функциях, которые...

Перегрузка << в многофайловом проекте
Чтобы узнать, как перегружать потоки, зашел на msdn, нашел там это: #include...

Ошибки в многофайловом проекте
Здравствуйте! У меня есть многофайловый проект. Он не закончен (только...

Иерархия классов в многофайловом проекте
Всем привет. Есть проблема с созданием программы. Должна быть небольшая...

10
nimazzzy
Заблокирован
29.07.2016, 10:30 #2
Не знаю, как работает твоя IDE, но по-нормальному, сначала нужно скомпилировать class.cpp в объектный файл, а потомпри компиляции main.cpp его использовать. Если твой среда пытается скомпилировать main.cpp в лоб, логично, что она просто не подозревает о существовании class.cpp и не может найти реализацию методов из class.h.
0
notAll
440 / 162 / 60
Регистрация: 27.05.2016
Сообщений: 439
Завершенные тесты: 2
29.07.2016, 10:46 #3
В class.cpp почему переменная justclass::count не инициализирована?

Добавлено через 2 минуты
Еще есть подозрение на конфликт имен с глобальным std::count из за using namespace std; в заголовке.
0
Croessmah
++Ͻ
14147 / 8072 / 1512
Регистрация: 27.09.2012
Сообщений: 19,910
Записей в блоге: 3
Завершенные тесты: 1
29.07.2016, 10:52 #4
Цитата Сообщение от notAll Посмотреть сообщение
В class.cpp почему переменная justclass::count не инициализирована?
С чего бы она не инициализирована?
Она будет инициализирована нулем.
Цитата Сообщение от GPU Посмотреть сообщение
Собирал в CodeBlocks.
Надеюсь, class.cpp добавили в проект?
Проект прикрепите в архиве, посмотрю,
возможно, Вы нагородили в настройках или с проектом что-то не то.

за using namespace std; в заголовке,
надо сразу руки отрубать
1
Хрисипп
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 217
29.07.2016, 11:57 #5
может class.cpp - не cpp, a class.c.
0
GPU
0 / 0 / 0
Регистрация: 13.03.2016
Сообщений: 4
29.07.2016, 14:04  [ТС] #6
Croessmah, да, за это надо руки по самые ягодицы, я знаю)
notAll, надо будет проверить наличие конфлмкта, да
0
GPU
0 / 0 / 0
Регистрация: 13.03.2016
Сообщений: 4
29.07.2016, 18:11  [ТС] #7
Croessmah, вот папка проекта.
0
Вложения
Тип файла: rar temp.rar (8.0 Кб, 3 просмотров)
TheBig
-20 / 0 / 0
Регистрация: 28.07.2016
Сообщений: 41
29.07.2016, 18:34 #8
лучше class.cpp это по стандарту
0
DrOffset
7517 / 4513 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
29.07.2016, 18:58 #9
Лучший ответ Сообщение было отмечено GPU как решение

Решение

GPU, правой кнопкой на class.cpp, в меню выбери Properties. Появится вот такое окно:
Разделение класса со статической переменной в многофайловом проекте
Там выстави галочки для Debug и Release.
Внимательнее будь, когда файл в проект добавляешь
1
GPU
0 / 0 / 0
Регистрация: 13.03.2016
Сообщений: 4
29.07.2016, 19:08  [ТС] #10
DrOffset, да,я догадывался, что ошибка где-то в очень стыдном месте.

Спасибо.
0
DrOffset
7517 / 4513 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
29.07.2016, 19:13 #11
GPU, и это, кстати, очень просто можно продиагностировать, если посмотреть в окошко build log. Там показывается процесс компиляции. Вызовов компилятора должно быть столько, сколько у тебя компилируемых единиц в проекте, то есть два. А у тебя был всего один, потому что второй файл не относился ни к одной и целей сборки (ни к Debug, ни к Release).
1
29.07.2016, 19:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2016, 19:13
Привет! Вот еще темы с решениями:

Вызов функции в многофайловом проекте
Компилятор ругается на указатель на массив &quot;a&quot; , в файле main.cpp Вот файлы...

Ошибка LNK2019 в многофайловом проекте
Смысл: Мне нужно создать абстрактный класс контейнер, на его основе конкретные...

Ошибка линковки в многофайловом проекте
что за на??? в проекте 3 модуля: main.cpp, test.cpp, test.h, в main.cpp и...

Подскажите как создать конструктор класса в котором производится инкрементирование статической переменной!
Ребят Всем Добрых Суток!!! Запнулся на создании перегруженного конструктора,...


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

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

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