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

Отделение интерфейса от реализации

05.05.2015, 18:54. Показов 2407. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сделала рабочую программу. Нужно разделить интерфейс от реализации. Делаю как написано:
добавить в проект заголовочный файл *.h;
определить интерфейс класса в заголовочном файле
добавить в проект исполняемый файл *.cpp;
в исполняемом файле выполнить реализацию класса;
подключить заголовочный файл к программе.

При компилировании появляются ошибки:

Ошибка 2 error C2084: функция "Matrix::Matrix(int)" уже имеет текст реализации

Ошибка 5 error C2264: Matrix::Matrix: ошибка в определении или объявлении функции; функция не вызвана

Программу разделила на 3 части, как мне кажется, все как объясняли. В чем ошибка?
Описала это в Заголовочный файл matrix.h класса Matrix.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iomanip>
 
class Matrix
{
    private:
        float **ptr;
        int size;
    
    public:
        Matrix() {}; // конструктор по умолчанию
        Matrix( int n) : size(n) {}; // конструктор с параметрами
        Matrix(const Matrix &ob); // конструктор копии
        ~Matrix(); // деструктор 
        Matrix operator= (const Matrix& ob) ;
        Matrix  operator* (const Matrix& ); 
        Matrix  operator* (const float); 
        Matrix  operator/ (const float); 
        friend std::ostream &operator<< (std::ostream &, const Matrix &);
        friend std::istream &operator>> (std::istream &, Matrix &); 
  };

Исполняемый файл matrix.cpp класса Matrix.

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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include <iostream>
#include <Windows.h>
#include <iomanip>
#include "matrix.h"
 
 
     Matrix::Matrix() {} // конструктор по умолчанию
        Matrix::Matrix( int n) : size(n) // конструктор с параметрами
        {
            ptr = new float*[size];
            for ( int i = 0; i < size; i++ )
            {
                ptr[i] = new float[size];
            }
             for ( int i = 0; i < size; i++ )
                for ( int j = 0; j < size; j++ )
                {
                   ptr[i][j]=0.0;
                }
        }
    Matrix::Matrix(const Matrix &ob) // конструктор копии
        { 
        size = ob.size; 
        ptr = new float*[size]; 
           for ( int i = 0; i < size; ++i) 
           ptr[i] = new float[size]; 
        for ( int i = 0; i < size; ++i) 
            for ( int j = 0; j < size; ++j) 
               ptr[i][j] = ob.ptr[i][j];
        }  
 
         Matrix::~Matrix() // деструктор 
        {
            for ( int i = 0; i < size; i++ )
            {
                delete []ptr[i];
            }
            delete []ptr;
        } 
 
 
 
Matrix Matrix::operator * (const Matrix& ob) // умножение матриц друг на друга
     {  
      Matrix temp; 
      temp.size =size; 
      std::cout<< "Результаты после умножения матриц. ";
      temp.ptr = new float*[temp.size]; 
          for ( int i = 0; i < temp.size; ++i) 
             temp.ptr[i] = new float[temp.size];
                 for ( int i = 0; i < temp.size; i++) 
                    for ( int j = 0; j < temp.size; j++) 
                        { 
                          temp.ptr[i][j] = 0.0;
                          for (int k = 0; k < temp.size; ++k) 
                          temp.ptr[i][j] = temp.ptr[i][j] + (ptr[i][k] * ob.ptr[k][j]); 
                        }
                          return temp; 
       }
 
 Matrix Matrix::operator * (const float m) // умножение матрицы на число
      {     
       Matrix temp; 
       temp.size =size; 
       std::cout << "Результаты после умножения матрицы на число. ";
       temp.ptr = new float*[temp.size]; 
           for ( int i = 0; i < temp.size; ++i) 
              temp.ptr[i] = new float[temp.size];
                 for ( int i = 0; i < temp.size; i++) 
                    for ( int j = 0; j < temp.size; j++) 
                       { 
                        //temp.ptr[i][j] = 0.0;
                        temp.ptr[i][j] = ptr[i][j] * m; 
                        }
return temp; 
}
 
 Matrix Matrix::operator / (const float m) // деление матрицы на число
      {     
      Matrix temp; 
      temp.size =size; 
      std::cout << "Результаты после деления матрицы на число. ";
        temp.ptr = new float*[temp.size]; 
            for ( int i = 0; i < temp.size; ++i) 
               temp.ptr[i] = new float[temp.size];
                  for ( int i = 0; i < temp.size; i++) 
                      for ( int j = 0; j < temp.size; j++) 
                          { 
                          // temp.ptr[i][j] = 0.0;
                           temp.ptr[i][j] = ptr[i][j] / m; 
                          }
                           return temp; 
                          }
 
   Matrix Matrix::operator=(const Matrix& ob) // оператор присваивания
      { 
        for (int i= 0; i < size; ++i) 
            for (int j = 0; j < size; ++j) 
                ptr[i][j] = ob.ptr[i][j]; 
        return *this;
      } 
 
   std::istream &operator>> (std::istream & input, Matrix &obj) // перегруженный оператор ввода
{   std::cout << "Вводим значения в наш массив 2*2:"<<std::endl;
    for (int i = 0; i < obj.size; i++)
        for (int j = 0; j < obj.size; j++)
            std::cin >> obj.ptr[i][j]; 
 
    return std::cin;
}
 
std::ostream &operator<< (std::ostream &output, const Matrix &obj) // перегруженный оператор вывода
{  std::cout<<"Значения в матрице:"<<std::endl;
    for (int i = 0; i < obj.size; i++)
    {std::cout << std::endl;
        for (int j = 0; j < obj.size; j++)
        {
            std::cout << std::setw(5) << std::setprecision(3) << obj.ptr[i][j];
        }
    }
    std::cout << std::endl; 
    return std::cout; 
}

Оставила в исходном коде.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
#include "matrix.h"
#include <iostream>
#include <Windows.h>
#include <iomanip>
 
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    float m;
    Matrix m1(2); 
    std::cin >> m1;// перегруженная операция ввода
    Matrix m2(2);
    std::cout << "Введите цифру,на которую умножим матрицу:"<<std::endl;
    std::cin >> m;
    m2 = m1 * m;// перегруженная операция *
    std::cout << m2; // перегруженная операция вывода
    m2 = m2 / m;// перегруженная операция /
    std::cout << m2;
    std::cout << "Умножение матриц друг на друга:"<<std::endl;
    Matrix m3(2);
    std::cin >> m3;
    Matrix m4(2);
    std::cin >> m4;
    Matrix m5(2);
    m5 = m3 * m4;// [url]http://www.mathprofi.ru/deistviya_s_matricami.html[/url] пункт 5 "умножения матриц"
    std::cout << m5;
    std::cout << "Присвоим последней матрице, выведенной на экран, значение первой матрицы:"<<std::endl;
    m5 = m1;// перегруженная операция =
    std::cout << m5;
    system("pause");
    return 0;
 
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.05.2015, 18:54
Ответы с готовыми решениями:

Отделение интерфейса от реализации класса: компиляция кода реализации
Доброго времени суток, У меня возникла проблема с отделением интерфейса от реализации класса. Допустим, у меня есть три файла: 1....

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

Класс, отделение интерфейса от реализации
Всем привет. Пытаюсь разделить интерфейс от реализации. вот исходный код: файл GradeBook.h #include &lt;string&gt; using...

4
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
05.05.2015, 19:00
в matrix.h
C++
1
2
3
4
5
6
7
8
class Matrix
{
// ...
    public:
        Matrix(); // конструктор по умолчанию
        Matrix( int n); // конструктор с параметрами
// ...
};
они у вас определены в срр файле
0
2 / 2 / 2
Регистрация: 12.04.2014
Сообщений: 102
05.05.2015, 19:05  [ТС]
Разве я должна их убрать? Вроде как в заголовочном должны остаться они, но как прототипы, а описываю я их уже .cpp. Или нет? Возможно, глупые вопросы((( Но только практиковаться начала.
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
05.05.2015, 19:14
Лучший ответ Сообщение было отмечено lenarano как решение

Решение

ну так и оставьте объявления, как показал выше. без определений

Добавлено через 43 секунды
сравните со строками 10 11 в вашем matrix.h
1
2 / 2 / 2
Регистрация: 12.04.2014
Сообщений: 102
05.05.2015, 19:20  [ТС]
Да, увидела. Спасибо, что ткнули носом. Теперь все очевидно и работает, как часики.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.05.2015, 19:20
Помогаю со студенческими работами здесь

Отделение интерфейса класса от реализации
Осваиваю раздел одной книги &quot;Отделение интерфейса класса от реализации&quot;. То что получилось можно и нужно скачать по адресу...

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

Разделение интерфейса и реализации
Добрый день. Пытаюсь разделить проект, создал второй cpp и h файлы. Переменные объявлял в .h, были ошибки многократно определенного...

Какие механизмы обеспечивают разделение интерфейса и реализации?
Добрый день! Не подскажите какие механизмы обеспечивают разделение интерфейса и реализации? Чем больше – тем лучше.

Отделение интерфейса от реализации
Задача была разделить интерфейс от реализации. линковщик g++ ругается на неопределение функций в классе, что происходит понять я не могу -...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
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 Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru