Форум программистов, компьютерный форум CyberForum.ru

Дружественные (friend) функции - C++

Восстановить пароль Регистрация
 
maddoxx
0 / 0 / 0
Регистрация: 17.02.2013
Сообщений: 24
06.12.2013, 00:31     Дружественные (friend) функции #1
Доброго времени суток.
Кратко о сути:
Имеются 2 класса - Float (представляет собой число типа float) и FloatMatrix (представляет собой матрицу с типом float).
Так вот, я хочу написать дружественную функцию, которая бы умножала матрицу из объекта класса FloatMatrix на число из объекта Float.
Соответственно у меня 5 файлов:
main.cpp
Float.h
FloatMatrix.h
Float.cpp
FloatMatrix.cpp

Но я конкретно путаюсь к какому классу нужно писать friend функцию.
Я сделал следующим образом:
Объявил friend функцию в FloatMatrix.h
C++
1
friend void mulMatrixForValue(Float value, FloatMatrix & matrix);
В FloatMatrix.cpp написал ее реализацию
C++
1
2
3
4
5
6
void mulMatrixForValue(Float value, FloatMatrix & matrix)
{
    for(int i=0; i<matrix.getColumn(); i++)
        for(int j=0; j<matrix.getRow(); j++)
            matrix.ptr[i][j] = matrix.ptr[i][j] * value.getValue();
}
И в FloatMatrix.cpp подключил
C++
1
#include "floatClass.h"
Но возникают ошибки типа:
C++
1
2
Ошибка  1   error C2255: friend: не допускается вне определения класса  c:\documents and settings\admin\рабочий стол\5\5\floatmatrixclass.h 27
Ошибка  8   error C2248: FloatMatrix::ptr: невозможно обратиться к private член, объявленному в классе "FloatMatrix"    c:\documents and settings\admin\рабочий стол\5\5\floatmatrixclass.cpp   217
Подскажите пожалуйста, как правильно связать логику этой функции с файлами?(
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2013, 00:31     Дружественные (friend) функции
Посмотрите здесь:

C++ Friend-функции перегрузки оператора
C++ friend и member функции
Классы. Программирование алгоритмов с использованием конструктора, деструктора, friend - функции инициализации set() и функции вывода результатов prin C++
C++ Классы. Программирование алгоритмов с использованием конструктора, деструктора, friend - функции инициализации set() и функции вывода результатов pri
C++ Дружественные функции, реализация и вызов: Friend used outside of class
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.12.2013, 01:10     Дружественные (friend) функции #2
Цитата Сообщение от maddoxx Посмотреть сообщение
Объявил friend функцию в FloatMatrix.h
Это в объявлении класса нужно сделать. Если нужно, то можно в двух классах.
maddoxx
0 / 0 / 0
Регистрация: 17.02.2013
Сообщений: 24
06.12.2013, 01:21  [ТС]     Дружественные (friend) функции #3
Цитата Сообщение от alsav22 Посмотреть сообщение
Это в объявлении класса нужно сделать. Если нужно, то можно в двух классах.
Так я же так и сделал вроде бы, вот чуть кода:
Обьявление друж.функции
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
//FloatMatrix.h
#ifndef floatMatrixClass_h
#define floatMatrixClass_h
 
class FloatMatrix
{
    float **ptr;
    int column,row,error;
public:
    FloatMatrix();
    FloatMatrix(int);
    FloatMatrix(int, int);
    FloatMatrix(FloatMatrix &);
    ~FloatMatrix();
    void setColumn(int);
    int getColumn();
    void setRow(int);
    int getRow();
    void setError(int);
    int getError();
    void reallocMemoryLine(int);
    void reallocMemoryMatrix(int, int);
    void inputMatrix();
    void printMatrix();
    void exceptionError();
    friend void mulMatrixForValue(Float value, FloatMatrix & matrix);
};
 
#endif floatMatrixClass_h
Реализация
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//FloatMatrix.cpp
#ifndef floatMatrixClass_cpp
#define floatMatrixClass_cpp
 
#include <iostream>
#include <iomanip>
#include "floatMatrixClass.h"
#include "floatClass.h"
 
using namespace std;
 
void mulMatrixForValue(Float value, FloatMatrix & matrix)
{
    for(int i=0; i<matrix.getColumn(); i++)
        for(int j=0; j<matrix.getRow(); j++)
            matrix.ptr[i][j] = matrix.ptr[i][j] * value.getValue();
}
#endif floatMatrixClass_cpp
Не пойму что не так
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.12.2013, 02:10     Дружественные (friend) функции #4
Цитата Сообщение от maddoxx Посмотреть сообщение
#ifndef floatMatrixClass_cpp
#define floatMatrixClass_cpp
Для .cpp такое не делают, или вы его где-то подключаете?
Цитата Сообщение от maddoxx Посмотреть сообщение
#include "floatMatrixClass.h"
#include "floatClass.h"
class FloatMatrix в каком .h файле объявлен? Вверху кода написано, что FloatMatrix.h. Если так, то где подключение? Или не так написано?
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
06.12.2013, 08:13     Дружественные (friend) функции #5
Цитата Сообщение от maddoxx Посмотреть сообщение
Не пойму что не так
Попробуй сделать и определение функции там же.
zss
Модератор
Эксперт С++
 Аватар для zss
5946 / 5551 / 1784
Регистрация: 18.12.2011
Сообщений: 14,178
Завершенные тесты: 1
06.12.2013, 08:49     Дружественные (friend) функции #6
А какие ошибки выдает компилятор?
getValue() из класса Float общедоступная (public)?
C++
1
void mulMatrixForValue(Float value, FloatMatrix & matrix);
еще должна быть объявлена в заголовочном файле вне тела класса FloatMatrix (без слова friend).
Кстати, у Вас она умножает матрицу на число и результат получается в этой же матрице.
Если надо результат получить в другой матрице, то функция должна быть такой
C++
1
FloatMatrix mulMatrixForValue(Float value, FloatMatrix & matrix);
Yandex
Объявления
06.12.2013, 08:49     Дружественные (friend) функции
Ответ Создать тему
Опции темы

Текущее время: 02:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru