2 / 2 / 2
Регистрация: 12.04.2014
Сообщений: 102
1

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

05.05.2015, 18:54. Показов 1754. Ответов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.05.2015, 18:54
Ответы с готовыми решениями:

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

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

Класс, отделение интерфейса от реализации
Всем привет. Пытаюсь разделить интерфейс от реализации. вот исходный код: файл GradeBook.h ...

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

4
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
05.05.2015, 19:00 2
в 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  [ТС] 3
Разве я должна их убрать? Вроде как в заголовочном должны остаться они, но как прототипы, а описываю я их уже .cpp. Или нет? Возможно, глупые вопросы((( Но только практиковаться начала.
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
05.05.2015, 19:14 4
Лучший ответ Сообщение было отмечено lenarano как решение

Решение

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

Добавлено через 43 секунды
сравните со строками 10 11 в вашем matrix.h
1
2 / 2 / 2
Регистрация: 12.04.2014
Сообщений: 102
05.05.2015, 19:20  [ТС] 5
Да, увидела. Спасибо, что ткнули носом. Теперь все очевидно и работает, как часики.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.05.2015, 19:20

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

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

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

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


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

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

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