Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
22 / 13 / 9
Регистрация: 16.10.2019
Сообщений: 64

Определение методов класса вне класса

21.03.2020, 17:35. Показов 2277. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть базовый класс "publication", производный от него "book" и производной от book - "type". Когда определяю методы внутри класса ошибок нет, но если вывожу их за класс то компилятор ругается. В чём проблема ?

Ошибка


C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include "publication.h"
 
using namespace std;
 
int main()
{
    return 0;
}
publication.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
#pragma once
#include <string>
#include <iostream>
 
using namespace std;
 
class publication
{
private:
    string name;
    mutable float price;
public:
    publication() :name("none"), price(0) { }
 
    publication(string name, float price) :name(name), price(price) { }
 
    inline void change()const;
    inline void put()const;
    void get();
};
 
inline void publication::change()const
{
    cout << "New price: ";
    cin >> price;
}
 
inline void publication::put()const
{
    cout << "Name: " << name << "|| Price: " << price << endl;
}
 
void publication::get()
{
    cout << "Name: ";
    cin >> name;
    cout << "Price: ";
    cin >> price;
}


book.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
#pragma once
#include <iostream>
#include "publication.h"
 
using namespace std;
 
class book : private publication
{
private:
    int size;
public:
    book() : publication(), size(0) { }
 
    book(string name, float price, int size) : publication(name, price), size(size) { }
 
    void change();
    void get();
    inline void put()const;
};
 
void book::change()
{
    publication::change();
}
 
void book::get()
{
    publication::get();
 
    cout << "Size: ";
    cin >> size;
}
 
inline void book::put()const
{
    publication::put();
 
    cout << "Size: " << size << endl;
}


type.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
#pragma once
#include <iostream>
#include "book.h"
 
using namespace std;
 
class type : private book
{
private:
    float time;
public:
    type() : book(), time(0) { }
 
    type(string name, float price, int size, float time) : book(name, price, size), time(time) { }
 
    inline void put()const;
    void change();
    void get();
};
 
inline void type::put()const
{
    book::put();
 
    cout << "Time: " << time;
}
 
void type::change()
{
    book::change();
 
    cout << "New time: ";
    cin >> time;
}
 
void type::get()
{
    book::get();
 
    cout << "Time: ";
    cin >> time;
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.03.2020, 17:35
Ответы с готовыми решениями:

Определение методов вне класса
Определение методов вне класса используется только для того, чтобы не вносить беспорядок или есть еще какая- то причина?

Определение методов класса
Доброго времени суток, Такой вопрос возник: В заголовочном файле (head.h) я объявил класс using namespace std; class integer ...

Определение методов шаблонного класса
Столкнулся с такой проблемой, реализовываю итератор для шаблонного списка, при определении метода интератора вылетает ошибка вот лог : ...

6
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
21.03.2020, 17:42
У меня компилируется.
Только в main надо подключать book.h
и все не inline описания вынести в отдельный cpp файл и подключить его к проекту.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12935 / 6802 / 1821
Регистрация: 18.10.2014
Сообщений: 17,214
21.03.2020, 17:51
Лучший ответ Сообщение было отмечено LizyH как решение

Решение

Во-первых, у вас в программе используется только publication.h и никак не используются type.h и book.h. Зачем вы их привели?
Во-вторых, при компиляции именно такой программы, как вы привели, никаких ошибок не будет.
В-третьих, где текст ошибки?

Цитата Сообщение от LizyH Посмотреть сообщение
C++
1
void publication::get()
Так а куда вдруг здесь пропало inline??? Прямо в заголовочных фалах можно определять только inline методы (или шаблонные методы).

Вы аккуратно объявляете многие методы inline, что правильно. А здесь вдруг перестали. Неудивительно, что получаются ошибки.

Цитата Сообщение от LizyH Посмотреть сообщение
C++
1
void change()const;
Почему вдруг метод, который явно меняет содержимое объекта, объявлен как const? Из-за этого странного объявления поле price вдруг стало mutable. Зачем?
1
22 / 13 / 9
Регистрация: 16.10.2019
Сообщений: 64
21.03.2020, 18:15  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
у вас в программе используется только publication.h и никак не используются type.h и book.h. Зачем вы их привели?
Не работал в main файле. Не обратил внимание, что подключено не то.


Цитата Сообщение от TheCalligrapher Посмотреть сообщение
у вас в программе используется только publication.h и никак не используются type.h и book.h. Зачем вы их привели?
Если б я не привёл type.h и book.h как вы тогда расписали бы мои ошибки ?

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
В-третьих, где текст ошибки?
Привёл же выше под спойлером


Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Почему вдруг метод, который явно меняет содержимое объекта, объявлен как const?
Задумывалось иметь возможность изменить поле price, но при этом не давать возможность изменить name.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12935 / 6802 / 1821
Регистрация: 18.10.2014
Сообщений: 17,214
21.03.2020, 18:25
Цитата Сообщение от LizyH Посмотреть сообщение
Если б я не привёл type.h и book.h как вы тогда расписали бы мои ошибки ?
У вас они видны уже в publication.h.

Цитата Сообщение от LizyH Посмотреть сообщение
Привёл же выше под спойлером
Под спойлером у вас пустота.

Цитата Сообщение от LizyH Посмотреть сообщение
Задумывалось иметь возможность изменить поле price, но при этом не давать возможность изменить name.
"Не давать" кому? Самому себе, автору класса? Самодисциплина - это тоже важно, но в данном случае получилась ерунда.
0
21.03.2020, 18:27

Не по теме:

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Под спойлером у вас пустота.
У него там картинка, которая у вас, видимо, не прогрузилась.
На картинке ошибки линкера из-за многократно определенных символов.

0
21.03.2020, 18:29

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
У него там картинка, которая у вас, видимо, не прогрузилась.
А, теперь вижу. Несколько раз перегружал страницу - все равно была пустота

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.03.2020, 18:29
Помогаю со студенческими работами здесь

Определение класса в DLL - ипользование вне и динамически
Однажды я уже задавал подобный ворос, ответа так и не получил. В свое время я обошелся без использования классов из DLL, но сейчас вновь...

Определение методов шаблонного класса в файле реализации
Доброго времени суток, форумчане! :) Поздравляю всех мужчин с праздником. Желаю быть мужественными, стойкими, рассудительными и...

Определение метода вне класса, как inline в многофайловом проекте
Здравствуйте! Помогите разобраться!) В общем имеется: ...

Как вынести описание методов вложенного класса за пределы класса?
Подскажите, пожалуйста, как мне вынести описание методов вложенного класса за пределы класса?

Наследование: Как мне определить любой из методов заданного класса внутри другого класса?
Добрый день, подскажите пожалуйста, что я делаю не так Есть файл Container.h в котором храню прототипы методов class Container ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru