C++: дружественные функции

Модератор: Модераторы разделов

IMB
Сообщения: 2567
ОС: Debian

C++: дружественные функции

Сообщение IMB »

Доброго дня!
Есть программа работающая в несколько потоков и есть необходимость заполнять буфер в потоке данными из другого потока.

Код: Выделить всё

class Stream : protected Thread {
struct StreamEnv {
        Rendezvous_Handle hRendezvousInit;
        unsigned int imageWidth;
        unsigned int imageHeight;
        Fifo_Handle hInFifo;
        source_buff_t m_jpeg;
        source_buff_t m_meta;
    } streamEnv;
....................................
public:
friend int Display::fillMetaBuffer(unsigned char *buff);
............................

Код: Выделить всё

int Display::fillMetaBuffer(unsigned char *buff)
{
    if (NULL == buff)
        return -1;

    unsigned int size = 32;

    pthread_mutex_lock(&streamEnv.m_meta.mutex);

    streamEnv.m_meta.buff[0]  = (streamEnv.imageWidth >> 24) & 0xFF;
    streamEnv.m_meta.buff[1]  = (streamEnv.imageWidth >> 16) & 0xFF;
    streamEnv.m_meta.buff[2]  = (streamEnv.imageWidth >>  8) & 0xFF;
    streamEnv.m_meta.buff[3]  = streamEnv.imageWidth & 0xFF;

    streamEnv.m_meta.buff[4]  = (streamEnv.imageHeight >> 24) & 0xFF;
    streamEnv.m_meta.buff[5]  = (streamEnv.imageHeight >> 16) & 0xFF;
    streamEnv.m_meta.buff[6]  = (streamEnv.imageHeight >>  8) & 0xFF;
    streamEnv.m_meta.buff[7]  = streamEnv.imageHeight & 0xFF;

    streamEnv.m_meta.size = 8;

    memcpy(streamEnv.m_meta.buff + streamEnv.m_meta.size, buff, size);
    streamEnv.m_meta.size += size;

    pthread_mutex_unlock(&streamEnv.m_meta.mutex);

    return 0;
}

Ошибка при компиляции - error: ‘streamEnv’ was not declared in this scope
Как бы её решить или как по другому, или может быть более правильно, решить эту задачу?
Спасибо.

Upd
Если я привожу фукцию к виду - fillMetaBuffer(const Stream&,unsigned char *buff), то ошибка следующая:

Код: Выделить всё

display.hpp:60: error: expected ‘,’ or ‘...’ before ‘&’ token
display.hpp:60: error: ISO C++ forbids declaration of ‘Stream’ with no type
Спасибо сказали:
Аватара пользователя
Dunris
Сообщения: 295
Статус: ...
ОС: Archlinux

Re: C++: дружественные функции

Сообщение Dunris »

В области видимости Display нет элемента "streamEnv", и даже явное обращение к Stream::streamEnv некорректно, ведь streamEnv - нестатический объект.
Простейшим решением было бы, наверное, передача объекта по ссылке Stream& arg в Display::fillMetaBuffer, а там обращение к arg.streamEnv, например.
Могу ошибаться, конечно, сам новичок в C++.
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: C++: дружественные функции

Сообщение Crazy »

int Display::fillMetaBuffer(const Stream& obj,unsigned char *buff)
{
// ...
obj.streamEnv.m_meta.buff[0] = (streamEnv.imageWidth >> 24) & 0xFF;
// ...
}

И пошлет далеко и надолго, т.к. модификатор const защищает содержимое на которое ссылается ссылка, если streamEnv не имеет mutalbe.

Код: Выделить всё

display.hpp:60: error: ISO C++ forbids declaration of ‘Stream’ with no type

В display.hpp
Нужно сделать объявление имени класса.

Код: Выделить всё

// display.hpp
class Stream;
class Display
{
  // ...
  int fillMetaBuffer(Stream& obj,unsigned char *buff)
  //...
}

А в display.cpp

Код: Выделить всё

// display.cpp
#include "display.cpp"
#include "stream.hpp"

Desipere in loco
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: C++: дружественные функции

Сообщение IMB »

Спасибо!
Но похоже дружественные функции мне здесь не помогут, так как ни в одном потоке ничего не известно о другом.
Спасибо сказали:
Ramol
Сообщения: 44
ОС: Debian

Re: C++: дружественные функции

Сообщение Ramol »

Ну может если в вкратце рассказать что надо сделать может кто то и рассказал как надо сделать взаимодействия между классами и какие между ними должны бить отношения. Лично я видел мало вариантов в которых действительно френды были нужны так как ты предоставляешь прайвет данные другому классу который очень будет зависеть от них лично я стараюсь френдов избегать.
Спасибо сказали: