Russian Qt Forum
Ноябрь 23, 2024, 16:56 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: friend-функция в dll  (Прочитано 3406 раз)
andrey2033
Гость
« : Июль 14, 2010, 09:31 »

Доброго времени суток!
У меня возникла проблема с friend-функциями класса в моей библиотеке. При их наличии компилятор выдаёт ошибку undefined reference to ... к этим функциям...
Без них всё работает. И отсюда вопрос: в dll нельзя пользоваться friend-функциями?


Уточню: Сама библиотека компилируется нормально, но при подключении к проекту при использовании friend-функций выдаёт вышеупомянутое..
« Последнее редактирование: Июль 14, 2010, 10:21 от andrey2033 » Записан
niXman
Гость
« Ответ #1 : Июль 14, 2010, 10:42 »

код показывай...что за функции, и как пытаешься их использовать.
Записан
andrey2033
Гость
« Ответ #2 : Июль 14, 2010, 10:47 »

Проблема в том, что код уже исправлен на не содержащий friend'ов. А функции - перегруженный оператор сдвига влево для вывода в поток и ещё одна, ну вообщем:

подключается статически

#ifndef DYNMATRIX_H
#define DYNMATRIX_H

#include <QtGlobal>
//! ===========================================================================
#ifdef D_SHARED_LIB
   #define D_SHARED Q_DECL_EXPORT
#else
   #define D_SHARED Q_DECL_IMPORT
#endif
//! ===========================================================================
#include <QTextStream>
#include <cmath>
//! ===========================================================================
class D_SHARED DynMatrix
{
public:
    DynMatrix( int m, int n );/// конструктор( создаёт нулевую матрицу размерностью m x n )
    DynMatrix( const DynMatrix& rhs );/// конструктор копирования
    ~DynMatrix();/// деструктор
//! ---------------------------------------------------------------------------
    /** возвращает указаный элемент*/
    float element( int i, int j )const{
        return data[j];
    }
    /** устанавливает указаный элемент в указаное значение*/
    void setElement( int i, int j, float value ){
        data[j] = value;
    }
    /** возвращает указаный элемент*/
    float& operator()( int i, int j )const{
        return data[j];
    }
    /** возвращает количество строк матрицы*/
    unsigned m() const{
        return m_;
    }
    /** устанавливает количество строк матрицы*/
    void setM( unsigned value ){
        m_ = value;
    }
    /** возвращает количество столбцов матрицы*/
    unsigned n() const{
        return n_;
    }
    /** устанавливает количество столбцов матрицы*/
    void setN( unsigned value ){
        n_ = value;
    }
    /** возвращает элементы матрицы в виде двумерного массива*/
    float** elements() const{
        return data;
    }
//! ---------------------------------------------------------------------------
    DynMatrix& operator+=( const DynMatrix& rhs );/// возвращает ссылку на матрицу, увеличеной на другую
    DynMatrix& operator-=( const DynMatrix& rhs );/// возвращает ссылку на матрицу, уменьшеную на другую
    DynMatrix& operator*=( const float rhs );/// возвращает ссылку на матрицу, домноженой на число
    DynMatrix& operator/=( const float rhs );/// возвращает ссылку на матрицу, доделёную на число
//! ---------------------------------------------------------------------------
    DynMatrix operator+( const DynMatrix& rhs )const;/// складывает две матрицы
    DynMatrix operator-( const DynMatrix& rhs )const;/// вычитает одну матрицу из другой
    DynMatrix operator*( const DynMatrix& rhs )const;/// возвращает матрицу, умноженую на другую
    DynMatrix operator*( const float rhs )const;/// возвращает матрицу умноженную на число
    friend DynMatrix operator*( const float lhs, const DynMatrix rhs );/// возвращает матрицу умноженную на число( число - левый операнд )
    DynMatrix operator/( const float rhs )const;/// возвращает матрицу делённую на число
//! ---------------------------------------------------------------------------
    DynMatrix& operator=( const DynMatrix& rhs );/// оператор присвоения
//! ---------------------------------------------------------------------------
    DynMatrix operator!() const;/// возвращает транспонированую матрицу
    DynMatrix preMinor( unsigned row, unsigned col )const;/// возвращает указаный минор
    float determinant() const;/// возвращает определитель
    DynMatrix inverse() const;/// возвращает обратную матрицу
    DynMatrix toTriangle();/// возвращает соответствующую треугольную матрицу
    /*friend */void toTriangle(/* DynMatrix& A,*/ DynMatrix& B );
//! ---------------------------------------------------------------------------
    /*friend */QTextStream& operator<<( QTextStream& os/*, DynMatrix& m*/ );/// выводит матрицу в поток вывода Qt
private:
    unsigned m_, n_;/// число строк и столбцов
    float** data;/// массив, содержащий элементы матрицы
};
//! ===========================================================================
#endif // DYNMATRIX_H

Две последнии функции..

Их описание:

//! ===========================================================================
//! [19]
void DynMatrix ::toTriangle(/*DynMatrix& A,*/ DynMatrix& B )
{
    //if( m != n )break;
    /*DynMatrix result( m, n );
    result = *this;*/
    for( unsigned i = 0; i < n_ - 1; ++i )
    {
        for( unsigned j = i; j < n_ - 1; ++j )
        {
            float c = data;
            float c_1 = data[j + 1];
            for( unsigned k = i; k < n_; ++k )
            {
                data[k] /= c;
                data[k] *= c_1;
                data[j + 1][k] -= data[k];
            }
            B.data
  • /= c;
           B.data
  • *= c_1;
           B.data[j + 1][0] -= B.data
  • ;
       }
    }
}
//! [19]
//! ===========================================================================
//! [20]
QTextStream& DynMatrix ::operator<<( QTextStream& os/*, DynMatrix& m*/ )
{
    for( unsigned i = 0; i < m_; ++i )
    {
        for( unsigned j = 0; j < n_; ++j )
        {
            os << data[j] << "  ";
        }
        os << endl;
    }
    return os;
}
//! [20]
//! ===========================================================================
« Последнее редактирование: Июль 14, 2010, 10:56 от andrey2033 » Записан
niXman
Гость
« Ответ #3 : Июль 14, 2010, 12:51 »

не понял... сейчас все работает? вопрос исчерпан?
Записан
andrey2033
Гость
« Ответ #4 : Июль 14, 2010, 13:09 »

Нет... вопрос "Можно ли пользоваться friend-функциями в dll?" - по прежнему открыт.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #5 : Июль 14, 2010, 21:07 »

>>"Можно ли пользоваться friend-функциями в dll?"
в исходниках Qt их хоть отбавляй, а Qt - набор DLL"ок
Записан

Юра.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.051 секунд. Запросов: 23.