LINUX.ORG.RU

Избранные сообщения Boy_from_Jungle

[OOP][C++] Отделение интерфейса от реализации

Форум — Development

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

Кое-где предлагают решать эту проблему при помощи класса-обертки. Применяется ли этот подход в крупных проектах и есть ли более красивое решение?

Вот пример такого подхода:

// rectangle_impl.h
class RectangleImpl {
    int x, y;
public:
    RectangleImpl(void);
    void set_values (int,int);
    int area (void);
};


// rectangle.h
class RectangleImpl;

class Rectangle {
public:
    Rectangle(void);
    void set_values (int,int);
    int area (void);
private:
    RectangleImpl *impl;
};


// rectangle.cpp
//...

Rectangle::Rectangle() {
    impl = new RectangleImpl;
}

Rectangle::set_values(int w, int h) {
    impl->set_values(w, h);
}

//...
Это сильно упрощенный пример тут нет конструктора копирования, перегруженного оператора присваивания и деструктора.

Спасибо за внимание.

 ,

frozenix
()

Pimpl + const'анстность методов

Форум — Development

Набрел я в хабре на следующую статью Перевод статьи «Pimp my Pimpl», часть 2

А именно на проблемы константности методов. Обычный Pimpl

class A()
{
void some() {_a->some();}
void some() const {_a->some();}

class Impl;
Impl* _a;
}
Для обоих A::some вызовет не константный метод A::Impl::some(). Увидав предложенный в статье deep_const_ptr, Я подумал «а зачем ?» ведь в место него можно заюзать shared_ptr. И вот тут меня настигло разочарование
    T * operator-> () const // never throws
    {
        BOOST_ASSERT(px != 0);
        return px;
    }

    T * get() const // never throws
    {
        return px;
    }

единственный вопрос, ПОЧЕМУ ? почему не

    T * get() // never throws
    {
        return px;
    }

    const T * get() cnost// never throws
    {
        return px;
    }

Cupper
()

Любовь к C++. Как бороться с собственной невнимательностью.

Форум — Development

Как я люблю этот язык. Всего лишь из-за одного лишнего символа в описании членов класса я убил на отдладку более 6 часов.

/** @brief Задание для отправки много авторок */
class CCrShareSender : public boost::enable_shared_from_this<CCrShareSender> {
public:
	CCrShareSender(QList<CrShare>& a_shares, CAdminWidget* a_widget);
	~CCrShareSender();
	/** @brief Отправить все */
	sequence::_void sendAll();
private:
	CTaskModel m_model;					///< Модель вывода
	QList<CrShare>& m_shares;			///< Оставшиеся шары

В последней строчку случайно появился &.

А как вы ловите такие ошибки? Кроме долгого вхождения в ДЗЕН

namezys
()

Задачка для ума. Из С++, но язык значения не имеет - главное типизация

Форум — Development

Есть функция. Она должна в списке объектов найти объект по заданым свойствам.

Что делать, если функция не нашла объект?

Бросить исключение - не хочется. Понятие пустого объекта нет.

namezys
()

Комрады С++, меня глючит с понедельника или нет? (про десткрутор и исключения)

Форум — Development

Разве в С++ дестркутор может кидать исключение? Или это запрещено только на договоренностях?

ЗЫ: стандарт читать лень - понедельник

namezys
()

C++ xmpp

Форум — Development

Хочу написать бота на С++. Требуется что бы написанного бота можно было просто скинуть на сервер и запустить.
Вычитал, что все используют gloox. Меня смущает что gloox нужно устанавливать. Можно ли будет потом собрать все необходимые файлы и запустить бота на сервере без установки чего либо дополнительного? Или что лучше подойдет для моих целей?
Раньше на C++ ничего не делал кроме хелловорлдов. Собственно написать бота и решил, чтобы попрактиковаться.
Пните в нужном направление.

 , ,

TDrive
()

запись в sqlite базу из многопоточного приложения

Форум — Development

есть многопоточное приложение. оно пишет в sqlite базу. Здесь нет ничего сложного, так как sqlite поддерживает multiple connections. Но есть одно но. часто после вставки нужно взять last inserted id.

подскажите алгоритм, наиболее подходящий для данной задачи. пока что склоняюсь к этому

если это имеет значение - использую ruby

 ,

ZuBB
()