Проблема с классами. Пожалуйста помогите

/* main.cpp */
#include <iostream>
#include "kal.cpp"

int main(int argc, char *argv[])
{
        std::int a,b; //локальная переменная хранящая а и б
    //ввод а и б
    cout << "A= ";
    cin >> a;
    cout << "B= ";
    cin >> b;

    //передача параметров конструктору
    kal *kalk = new kal(a,b);

    //сумма и сохранение её
    float sum = a + b;
    kal->set_sum(sum);

    //вывод данных
    std::cout << kal->get_a() << "+" 
              << kal->get_b() << "=" 
              << kal->get_sum() << std::endl;
    //удаление обекта из памяти
    delete kalk;
    return 0;
}

Это маин был!

/* kal.cpp */
#include <fstream>
#include <iostream>
#include "kal.h"

//конструктор
kal::kal(std::int a, std::int b)
{
        kal::set_a(a);
        kal::set_b(b);
}

//установка первого числа
void kal::set_a(std::int user_a)
{
    kal::a = user_a;
}

//получение первого числа
std::int kal::get_a()
{
    return kal::a;
}

//установка и получение второго числа
void kal::set_b(std::int user_b)
{
    kal::b = user_b;
}
std::int kal::get_b()
{
    return kal::b;
}

//установка и получение сумы
void kal::set_sum(std::int user_sum)
{
    kal::sum = user_sum
}
std::int kal::get_sum()
{
    return kak::sum;
}

Это было Отделение данных от логики

/* kal.h */ //мне кажется это комменатрий только в дужках
#pragma once // защита от повторного подключения заголовки... что это я не понимаю
#include <iostream> //так как мне нужны только числа мб подлючить стандартную библиотеку

class kal //описываю клас калькулятора
{
    public:
        //конструктор
        kal(std::int, std::int); 
        //установка первого числа
        void set_a(std::int);
        //получение первого числа
        std::int get_a();

        //установка второго числа
        void set_b(std::int);
        //получение второго числа
        std::int get_b();

        //установка суммы
        void set_sum(float);
        //получение суммы
        float get_sum();
    private:
        //a
        std::int a;
        //b
        std::int b;
        //sum
        std::int sum;   
};

ну а это уже расширение .h, тоесть продолжение отделения.

Так вот. компилирую прогу (прога простая я только хочу научиться более-менее автономно это делать самому, что честно не выходит пока). Но выбивает ошибка в третьем коде с .h
в чём ошибка? — пишет что ошибка и интом в начале кода... ну вот впрочем:
(class)\kal.h [Error] expected unqualified-id before 'int'
(class)\kal.h [Error] expected ')' before 'int'
и далее пошли ошибки того типа из-за этой одной... что делать?

Тип int не описывается в пространстве имён std. Поэтому компилятор ругается. int — предопределённый тип.
В остальных файлах тоже поправь.

/* kal.h */ //мне кажется это комменатрий только в дужках
#pragma once // защита от повторного подключения заголовки... что это я не понимаю

class kal //описываю клас калькулятора
{
    public:
        //конструктор
        kal(int, int); 
        //установка первого числа
        void set_a(int);
        //получение первого числа
        int get_a();

        //установка второго числа
        void set_b(int);
        //получение второго числа
        int get_b();

        //установка суммы
        void set_sum(float);
        //получение суммы
        float get_sum();
    private:
        //a
        int a;
        //b
        int b;
        //sum
        float sum;   // **!**
};

<iostream> нужен только в main. <fstream> — вообще не нужен.

В main нужно включать вместо kal.cppkal.h, а kal.cpp подключать в проекте (компилируется отдельно от main, подключается сборщиком при создании исполняемого файла).

В main нужно включать вместо kal.cpp — kal.h, а kal.cpp подключать в проекте (компилируется отдельно от main, подключается сборщиком при создании исполняемого файла).

можете объяснить?

Я попробую объяснить...

Создание исполняемого файла издавна производилось в два этапа: (1) компиляция исходного текста программы в объектный код и (2) сборка (линковка) объектных модулей, включая объектные модули из объектных библиотек, в исполняемый файл. Это классическая схема для компилируемых языков. (Сейчас уже используются и другие схемы.)

То, для чего успешно проходит этап (1), называют единицей компиляции.

main.cpp и kal.cpp — должны быть отдельными единицами компиляции.

Для успешной компиляции файла main.cpp необходимо только описание класса kal и его членов. Т.е. то, что содержится в заголовочном файле kal.h. Следовательно в main.cpp надо включить #include "kal.h".

Для успешной компиляции файла kal.cpp необходимо описание класса kal и его членов. Т.е. то, что содержится в заголовочном файле kal.h. Следовательно в kal.cpp надо включить #include "kal.h".

Сборщик (линкер) получит два объектных файла (main.obj и kal.obj) и свяжет их в один исполняемый файл, по ходу подключив из библиотек все необходимые модули.

А вот как эта схема реализуется — вопрос отдельный. Зависит от того, какие инструменты (IDE, например) ты используешь. Обычно в IDE есть некая сущность, под названием «Проект». Там аккумулируется информация о типе выходного файла или файлов (исполняемый файл, библиотека, консольное или GUI-приложение и т.д.), о разрядности приложения, об опциях компилятора и сборщика, и, наконец, об исходных файлах (исходные тексты, ресурсы, картинки, иконки и пр.). Вот в этом «проекте» у тебя должно быть указано два исходных файла (main.cpp и kal.cpp) и, обычно в отдельной ветке, заголовочный файл kal.h.

Непосредственное включение в main.cpp текста из kal.cpp (#include "kal.cpp") напрочь убивает модульность. Т.е. фактически, с таким же успехом можно было программу не делить на три файла, а писать всё в main.cpp.

Обычно так не делают. Это считается плохим стилем программирования.

Пожалуйста срочно надо
Написать программу использующую подпрограмму(функцию)/
Сумма отрицательных элементов массива Y.

Для работы подпрограмма должна использовать только свои локальные переменные и формальные аргументы. В подпрограмме должен осуществляться ввод исходных данных, однократный вызов подпрограммы обработки данных и вывод результата на экран.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.