0 / 0 / 0
Регистрация: 17.02.2013
Сообщений: 24
1

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

06.12.2013, 00:31. Показов 1755. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток.
Кратко о сути:
Имеются 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
Подскажите пожалуйста, как правильно связать логику этой функции с файлами?(
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.12.2013, 00:31
Ответы с готовыми решениями:

Дружественные функции, реализация и вызов: Friend used outside of class
Подскажите, пожалуйста, как превратить этот метод вычисления боковой поверхности в дружественную...

Перегрузка операторов, friend или нет friend?
Всем здравствуйте. Есть такой вопрос: при перегрузке операторов в классе(пусть будут + и = (вообще...

Классы. Программирование алгоритмов с использованием конструктора, деструктора, friend - функции инициализации set() и функции вывода результатов prin
Братаны, выручайте!:help: Общая постановка. Пользовательский класс Х должен содержать необходимые...

Классы. Программирование алгоритмов с использованием конструктора, деструктора, friend - функции инициализации set() и функции вывода результатов pri
Братаны, выручайте! Общая постановка. Пользовательский класс Х должен содержать необходимые...

5
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
06.12.2013, 01:10 2
Цитата Сообщение от maddoxx Посмотреть сообщение
Объявил friend функцию в FloatMatrix.h
Это в объявлении класса нужно сделать. Если нужно, то можно в двух классах.
0
0 / 0 / 0
Регистрация: 17.02.2013
Сообщений: 24
06.12.2013, 01:21  [ТС] 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
Не пойму что не так
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
06.12.2013, 02:10 4
Цитата Сообщение от maddoxx Посмотреть сообщение
#ifndef floatMatrixClass_cpp
#define floatMatrixClass_cpp
Для .cpp такое не делают, или вы его где-то подключаете?
Цитата Сообщение от maddoxx Посмотреть сообщение
#include "floatMatrixClass.h"
#include "floatClass.h"
class FloatMatrix в каком .h файле объявлен? Вверху кода написано, что FloatMatrix.h. Если так, то где подключение? Или не так написано?
0
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
06.12.2013, 08:13 5
Цитата Сообщение от maddoxx Посмотреть сообщение
Не пойму что не так
Попробуй сделать и определение функции там же.
0
Модератор
Эксперт С++
13492 / 10748 / 6405
Регистрация: 18.12.2011
Сообщений: 28,681
06.12.2013, 08:49 6
А какие ошибки выдает компилятор?
getValue() из класса Float общедоступная (public)?
C++
1
void mulMatrixForValue(Float value, FloatMatrix & matrix);
еще должна быть объявлена в заголовочном файле вне тела класса FloatMatrix (без слова friend).
Кстати, у Вас она умножает матрицу на число и результат получается в этой же матрице.
Если надо результат получить в другой матрице, то функция должна быть такой
C++
1
FloatMatrix mulMatrixForValue(Float value, FloatMatrix & matrix);
0
06.12.2013, 08:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.12.2013, 08:49
Помогаю со студенческими работами здесь

Friend-функции
из теории ясно, что friend функция — это функция, которая не является членом класса, но имеет...

Не работают friend функции
Есть класс Student, где объявлены дружественные функции: #pragma once #include &lt;iostream&gt;...

friend и member функции
Народ, объясните пожалуйста как пишутся данные функции, принцип их написания, откуда что берется. И...

Реализация friend функции
Есть код. Нужно реализовать вывод ответа через friend. Подскажите пожалуйста как это сделать?...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru