Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
maddoxx
0 / 0 / 0
Регистрация: 17.02.2013
Сообщений: 24
#1

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

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

Доброго времени суток.
Кратко о сути:
Имеются 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2013, 00:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Дружественные (friend) функции (C++):

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

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

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

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

Friend-функции - C++
из теории ясно, что friend функция — это функция, которая не является членом класса, но имеет доступ к членам класса, объявленным в полях...

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

5
alsav22
5431 / 4826 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.12.2013, 01:10 #2
Цитата Сообщение от maddoxx Посмотреть сообщение
Объявил friend функцию в FloatMatrix.h
Это в объявлении класса нужно сделать. Если нужно, то можно в двух классах.
0
maddoxx
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
alsav22
5431 / 4826 / 442
Регистрация: 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
ninja2
814 / 188 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
06.12.2013, 08:13 #5
Цитата Сообщение от maddoxx Посмотреть сообщение
Не пойму что не так
Попробуй сделать и определение функции там же.
0
zss
Модератор
Эксперт С++
6686 / 6248 / 2083
Регистрация: 18.12.2011
Сообщений: 16,319
Завершенные тесты: 1
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.12.2013, 08:49
Привет! Вот еще темы с ответами:

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

Реализация friend функции - C++
Есть код. Нужно реализовать вывод ответа через friend. Подскажите пожалуйста как это сделать? Ничего не получается... #include &lt;iostream&gt;...

Почему ругается в friend функции - C++
std::ostream&amp; operator&lt;&lt;(std::ostream&amp; ost, const Array&amp; Ar) { for(int i=0; i&lt;m_current; i++) ost&lt;&lt;&quot;{&quot;&lt;&lt;arr&lt;&lt;&quot;}&quot;; return ost; ...

Friend-функции перегрузки оператора - C++
Всем доброго времени суток =) У меня есть следующий код заголовочного файла: enum month {jan = 1, feb, mar, apr, may, jun, jul, aug, sep,...


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

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

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