Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
57 / 43 / 12
Регистрация: 27.10.2018
Сообщений: 454

Ошибки компиляции при наследовании и выводе размера класса

21.05.2019, 22:53. Показов 802. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, представленный ниже код должен в результате своей работы выводит размер классов CDevice и CMonitor но при оторажение кода ничего нигде не обозначено красным а при компиляции объявляется целый пак ошибок(скрин прикреплен) и мне не хватает знаний чтобы пофиксить их, помогите пожалуйста ,спасибо.
Немогу понять где именно это "переопределение "обеих классов ,а вс не отображает.
С ошибкой использование неопределенного класса тоже неясно что делать так как клас по мнению вс не только определен сначала ,а еще и переопреден.
Из за этого я думаю не работает наследование и метод получение размера недоступем классам наследникам.
С С4430 столкнулся впервые.

//main.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
#include "Monitor.h"
#include <iostream>
 
#include <map>
 
//#include <stdexcept>
#include <typeinfo>
#include "GetSize.h"
#include "ClassRTSizeInfo.h"
 
#include "Device.h"
#include "Monitor.h"
using namespace std;
 
int main()
{
    //register_size<ClassRTSizeInfo>();
    register_size<CDevice>();
    register_size<CMonitor>();
 
    //ClassRTSizeInfo objectRTSizeInfo;
    CDevice objectA;
    CMonitor objectB;
 
    //cout << "sizeof(ClassRTSizeInfo) == " << objectRTSizeInfo.getSize() << endl;
    cout << "sizeof(class Microcircuit) == " << objectA.getSize() << endl;
    cout << "sizeof(class processor) == " << objectB.getSize() << endl;
    cout << endl << endl;
 
    system("pause");
    return 0;
}
//ClassRTSizeInfo.h
C++
1
class ClassRTSizeInfo {public:virtual DEC_GET_SIZE();};
//ClassRTSizeInfo.cpp
C++
1
2
3
4
5
6
7
#include <iostream>
#include <map>
//#include <stdexcept>
#include <typeinfo>
#include "GetSize.h"
#include "ClassRTSizeInfo.h"
SET_GET_SIZE(ClassRTSizeInfo);
//getsize.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef _GETSIZE_H
#define _GETSIZE_H
 
typedef std::map<const std::type_info*, std::size_t> sizes_container;
extern sizes_container s;
 
template<typename T>
void register_size()
{
    s.insert(sizes_container::value_type(&typeid(T), sizeof(T)));
}
 
std::size_t get_size(const std::type_info& typeinfo);
 
#define SET_GET_SIZE(Class) int Class::getSize(){ return get_size(typeid(*this)); };
#define DEC_GET_SIZE() int getSize();
 
#endif
//getsize.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
#include <vector>
#include <map>
#include <string>
 
#include "GetSize.h"
 
sizes_container s;
 
std::size_t get_size(const std::type_info& typeinfo)
{
    sizes_container::iterator it = s.find(&typeinfo);
    if (it != s.end())
    {
        return it->second;
    }
 
    return -1;
}
//device.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <map>
 
//#include <stdexcept>
#include <typeinfo>
#include "ClassRTSizeInfo.h"
#include "GetSize.h"
 
#include "Monitor.h"
using namespace std;
class CDevice : virtual public ClassRTSizeInfo
{
public:
    CDevice() { cout << "конструктор CDevice" << this << endl; };
    virtual ~CDevice() { cout << "деструктор  CDevice" << this << endl;  cout << endl;}
    bool Status(int ext = 0){return isWorking;}
protected:
    bool isOn;
    bool isWorking;
};
//monitor.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
#pragma once
 
#include "Device.h"
#include <iostream>
#include <string>
using namespace std;
class CMonitor : public CDevice
{
public:
    CMonitor(const CMonitor &other){this->data = new int[other.Size];for (int i = 0; i < other.Size; i++) {   this->data[i] = other.Size; } cout << "конструктор COPY CMonitor" << this << endl; };
    CMonitor(int size)     {           this->Size = size;          this->data = new int[size];         for (int i = 0; i < size; i++)          {               data[i] = i;        }           cout << "конструктор  CMonitor" << this << endl;};
    CMonitor() ;
    virtual ~CMonitor() ;
    virtual bool On();
    virtual bool Off();
    virtual bool Execute(char* cmd, void* prm);
    void ChangePar();
    CMonitor& operator= (const CMonitor& point)
    {
        if (this != &point)
        {
            word = point.word;
            brightness = point.brightness;
            expansion = point.expansion;
        }
        return *this;
    }
private:
    int *data;
    int Size;
    string word;
    double brightness;
    int expansion;
};
//monitor.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
#include "Monitor.h"
 
#include <iostream>
using namespace std;
 
CMonitor::CMonitor() {brightness = 0.5;expansion = 1024;}
CMonitor::~CMonitor()
{
    //if (word != 0){delete[] word;}
    cout << "деструктор CMonitor" << this << endl; delete[] data; 
}
bool CMonitor::On()
{
    cout << "Enter your word: ";
    cin >> word;
    isOn = true;
    cout << "Device is ready for work." << endl;
    return true;
}
bool CMonitor::Off()
{
    isOn = false;
    cout << "Device finished the work." << endl;
    return true;
}
bool CMonitor::Execute(char* cmd, void* prm)
{
    if (isOn)
    {
        //if (strcmp(cmd, "Show word") == 0)
        //{
        //  strcpy((char*)prm, word);
            cout << "Your word is " << word << endl;
        //}
        //else
        if (strcmp(cmd, "Show param") == 0)
        {
            cout << "Brightness: " << brightness * 100 << "%" << endl;
            cout << "Expansion: " << expansion << "p" << endl;
        }
        else if (strcmp(cmd, "Clear") == 0)
        {
            word[0] = '\0';
        }
        return true;
    }
    else
    {
        cout << "Device doesn't work!" << endl;
        return false;
    }
}
 
void CMonitor::ChangePar()
{
    cout << "Enter Brightness(from 0 to 1): ";
    cin >> brightness;
    cout << "Enter Expansion: ";
    cin >> expansion;
}
Миниатюры
Ошибки компиляции при наследовании и выводе размера класса  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.05.2019, 22:53
Ответы с готовыми решениями:

Ошибки при наследовании класса
Доброго времени суток!Возникли ошибки при компиляции кода Задание было такое:Создать абстрактный базовый класс Body (тело) с виртуальными...

Ошибки при наследовании класса от вектора
Пишу программу по СМО, столкнулся с трудностью при попытке сделать наследование очередью Cqueue вектора из STL. Проблема состоит в том,...

Ошибка компиляции при наследовании классов
У меня есть класс CNew который наследует класс CTransport но при компиляции выводит ошибку ниже 4 раза для 2 строки файла CNew.h .Мне не...

9
 Аватар для Krokodil9798
330 / 145 / 56
Регистрация: 17.10.2015
Сообщений: 580
21.05.2019, 23:02
Включите в каждом .h файле #pragma once

Добавлено через 46 секунд
Это должна быть первая строка каждого файла
0
57 / 43 / 12
Регистрация: 27.10.2018
Сообщений: 454
21.05.2019, 23:04  [ТС]
Цитата Сообщение от Krokodil9798 Посмотреть сообщение
Включите в каждом .h файле #pragma once
Ошибки переопределения решены,спасибо.
Но остальные все еще нет.
Миниатюры
Ошибки компиляции при наследовании и выводе размера класса  
0
57 / 43 / 12
Регистрация: 27.10.2018
Сообщений: 454
21.05.2019, 23:11  [ТС]
Только что заметил что в выводе ошибок файл "ClassRTSizeInfo.cpp" написан сначала с заглавными буквами , а потом без , не могли б вы подсказать почему так? Файла "сlassrtsizeinfo.cpp" нет.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
21.05.2019, 23:22
Цитата Сообщение от plzvtl Посмотреть сообщение
class ClassRTSizeInfo {public:virtual DEC_GET_SIZE();};
Надо, наверное, virtual size_t DEC_GET_SIZE();

Цитата Сообщение от plzvtl Посмотреть сообщение
cout << "sizeof(class Microcircuit) == " << objectA.getSize() << endl;
* * cout << "sizeof(class processor) == " << objectB.getSize() << endl;
Где у тебя объявлена getSize()?
0
57 / 43 / 12
Регистрация: 27.10.2018
Сообщений: 454
21.05.2019, 23:29  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Где у тебя объявлена getSize()?
16 строка файла "GetSize.h"
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Надо, наверное, virtual size_t DEC_GET_SIZE();
Миниатюры
Ошибки компиляции при наследовании и выводе размера класса  
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
21.05.2019, 23:47
Цитата Сообщение от plzvtl Посмотреть сообщение
16 строка файла "GetSize.h"
Не вижу

Добавлено через 1 минуту
И причём тут вообще этот заголовок? Там методы вызываются
0
57 / 43 / 12
Регистрация: 27.10.2018
Сообщений: 454
21.05.2019, 23:50  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Не вижу
Тогда,не могли б вы подсказать как правильно мне объявить данный метод в моем случае?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
21.05.2019, 23:58
Цитата Сообщение от plzvtl Посмотреть сообщение
Тогда,не могли б вы подсказать как правильно мне объявить данный метод в моем случае?
А что он должен возвращать?

Добавлено через 39 секунд
DEC_GET_SIZE - это что, макрос?
0
57 / 43 / 12
Регистрация: 27.10.2018
Сообщений: 454
22.05.2019, 00:15  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
А что он должен возвращать?
При вызове а строке 43 в мейне данного метода , должен произойти вызов SET_GET_SIZE(ClassRTSizeInfo); на строке 15 файла classrtsizeinfo.После должно произойти вхождение в цикл std::size_t get_size(const std::type_info& typeinfo) на строке 11 файла getsize.cpp и в результате должно вернутся значение размера класса - результат который я сразу же вывожу на экран.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.05.2019, 00:15
Помогаю со студенческими работами здесь

Использование шаблонов при наследовании, ошибка при компиляции
При изучении списков написал шаблон протестировал, все работает. После написал класс наследник от шаблона List.h, компилятор выдает...

Ошибки при компиляции класса "Строка". Не могу разобраться
Добрый день! Компилятор выдаёт такие вот ошибки. Не могу разобраться. 1&gt;c:\visual c++\ямп №2\ямп №2\string.cpp(16): error C4996:...

Ошибка при наследовании класса
Среда Visual Basic STUDIO’2010 Professional Наследование. Как устранить ошибку. Сделано согласно примеру MSDN'2008 Public Class...

Ошибка при наследовании класса
Всем доброго времени суток, пытаюсь отнаследовать класс, вот такой код я смастерил: #ifndef CLASS_H_ #define CLASS_H_ class stack ...

Segmentation fault при наследовании класса
Доброго времени суток! Имею класс Initialise и класс Environment. В первом создаются экземпляры движка и прочие сопутствующие вещи....


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru