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

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

Страниц: 1 ... 5 6 [7] 8 9 ... 16   Вниз
  Печать  
Автор Тема: Приватные методы  (Прочитано 102258 раз)
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #90 : Сентябрь 29, 2015, 14:49 »

Ведь возвращать приличную структуру по значению - ошибка начинающего. И немедленно вызывающему навязывается вумный указатель. И опять-таки, нормальная вещь, но не вызванная никакой необходимостью. Вот так и лепится псевдо-грамотный код который по сути говнокод, т.к. усилия направлены не на содержательную часть, а так - соблюсти мнимую грамотность.

Оно всё бы ничего, если бы не всякие мешающие проблемы, типа многопоточности. Если мы в одном потоке что-то получим по ссылке-голому указателю, то другой поток может убить объект, даже скопировать его можем не успеть.
Записан

Пока сам не сделаешь...
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #91 : Сентябрь 29, 2015, 14:52 »

В принципе, если бы не совместимость с С, было бы неплохо, если бы по умолчанию в C++ все методы были виртуальными, пока не указано обратное - таким образом можно было бы избежать совсем глупых ошибок.

Это было бы плохо, потому что нельзя переопределять всё подряд. И привело бы к большему числу глупых ошибок. Поэтому лучше явно указать, какие методы можно переопределить.

Обоснуйте, пожалуйста.

Кстати, было бы интересно посмотреть, как должен выглядеть правильный класс SomeCrap с вашей точки зрения.

Вариант 1:

Код:
class SomeCrap
{
public:
    virtual double GetSomeShit() const;

protected:
    virtual double CalculateSomeShit() const;

double GetShitValue() const { return m_shitValue; } // такой себе каноничныйъ геттеръ

private:
    double m_shitValue;
};

Вариант 2:   

Код:
class SomeCrap
{
public:
    virtual double GetSomeShit() const;

protected:
    virtual double CalculateSomeShit() const;

    double m_shitValue; // поскольку нет смысла читать это значие извне - оно может жить здеть и без геттера.
};


И еще вдогонку вопрос для Гугу: c++ позволяет использовать virtual опционально, например, так:

Код:
class SomeCrap
{
public:
    virtual double GetSomeShit() const;
};

class SomeNewCrap: public SomeCrap
{
public:
    double GetSomeShit() const;
};

или так:

Код:
class SomeCrap
{
public:
    double GetSomeShit() const;
};

class SomeNewCrap: public SomeCrap
{
public:
    virtual double GetSomeShit() const;
};

Наверное, это ДляЧегоТоБылоНужно и НеОшибкаЯзыка?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #92 : Сентябрь 29, 2015, 14:56 »

Оно всё бы ничего, если бы не всякие мешающие проблемы, типа многопоточности. Если мы в одном потоке что-то получим по ссылке-голому указателю, то другой поток может убить объект, даже скопировать его можем не успеть.

Это все конечно так, но копирующий конструктор тоже не обязан быть атомарным. Поэтому придется создание копии защищать мютексами и т.д.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #93 : Сентябрь 29, 2015, 14:57 »

Что значит опционно? Как только вы определяете метод виртуалом, он попадает в vtbl. Дальше он всегда будет виртуальным, отменить это нельзя.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #94 : Сентябрь 29, 2015, 14:57 »

Цитировать
И еще вдогонку вопрос для Гугу: c++ позволяет использовать virtual опционально, например, так:
В отнаследованном классе метод так и останется виртуальным. То, что ты не написал virtual ничего не меняет.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #95 : Сентябрь 29, 2015, 14:59 »

Racheengel, если архитектура класса не подразумевает изменение логики, то значит так и было задумано. Не можешь изменить, скопируй его и доработай под свои нужды. Или попроси человека для тебя переработать архитектуру.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #96 : Сентябрь 29, 2015, 15:00 »

Цитировать
И еще вдогонку вопрос для Гугу: c++ позволяет использовать virtual опционально, например, так:
В отнаследованном классе метод так и останется виртуальным. То, что ты не написал virtual ничего не меняет.

Это то все так, никто не спорит Улыбающийся Но человек, увидевший метод без virtual в десятом наследнике, не будет знать, виртуальный ли он на самом деле или нет, пока не дойдет до предка.

Сути, конечно, не меняет, но ИМХО создает неудобства. Хорошо, что в 11-м это запатчили. Но это значит, что была проблема в языке, не?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #97 : Сентябрь 29, 2015, 15:02 »

В нормальном кодстайле virtual надо писать во всех наследниках.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #98 : Сентябрь 29, 2015, 15:03 »

Racheengel, если архитектура класса не подразумевает изменение логики, то значит так и было задумано. Не можешь изменить, скопируй его и доработай под свои нужды. Или попроси человека для тебя переработать архитектуру.

Вот так и рождается копипаста на свет... Может такое быть, что придется пол-проекта копипастить Грустный Это разве хорошо...?

Еще хуже - а если код попал в закрытую библиотеку? И "человека" никакого нет, что делать?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #99 : Сентябрь 29, 2015, 15:04 »

В нормальном кодстайле virtual надо писать во всех наследниках.

Я не спорю Улыбающийся Но язык-то позволяет опускать virtual  в наследниках, может, в этом был ВеликийСмысл?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #100 : Сентябрь 29, 2015, 15:04 »

Это то все так, никто не спорит Улыбающийся Но человек, увидевший метод без virtual в десятом наследнике, не будет знать, виртуальный ли он на самом деле или нет, пока не дойдет до предка.
Это решалось культурой программирования: всегда указывать virtual перед виртуальными методами.
И я понимаю, что далеко не все делают так же, но это одна из причин не использовать их код. Улыбающийся
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #101 : Сентябрь 29, 2015, 15:05 »

В нормальном кодстайле virtual надо писать во всех наследниках.

Я не спорю Улыбающийся Но язык-то позволяет опускать virtual  в наследниках, может, в этом был ВеликийСмысл?
Тут соглашусь, это они зря сделали. Хотя, в этом мог быть какой-то свой скрытый смысл.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #102 : Сентябрь 29, 2015, 15:06 »

Кстати, поделюсь ссылкой на гайдлайн от Страуструпа и Саттера. Советую почитать всем https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md/
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #103 : Сентябрь 29, 2015, 15:45 »

Это было бы плохо, потому что нельзя переопределять всё подряд. И привело бы к большему числу глупых ошибок. Поэтому лучше явно указать, какие методы можно переопределить.
Обоснуйте, пожалуйста.

Забудет какой-нить невнимательный программёр указать nonvirtual для метода, а другой программёр полностью изменит логику работы метода, и получат оба сюрпризы. Когда метод объявляется виртуальным, то явно ожидается, что его логика может измениться, и с ним нужно быть внимательнее. Можно посмотреть на класс QAbstractItemModel, на всякие Insert/Move/Remove/Columns/Rows и им сопутствующие.
Цитировать
void QAbstractItemModel::beginInsertColumns(const QModelIndex & parent, int first, int last)

Begins a column insertion operation.
When reimplementing insertColumns() in a subclass, you must call this function before inserting data into the model's underlying data store.

Note: This function emits the columnsAboutToBeInserted() signal which connected views (or proxies) must handle before the data is inserted. Otherwise, the views may end up in an invalid state.

Цитировать
void QAbstractItemModel::columnsAboutToBeInserted(const QModelIndex & parent, int first, int last)

This signal is emitted just before columns are inserted into the model. The new items will be positioned between first and last inclusive, under the given parent item.

Note: Components connected to this signal use it to adapt to changes in the model's dimensions. It can only be emitted by the QAbstractItemModel implementation, and cannot be explicitly emitted in subclass code.

Note: This is a private signal. It can be used in signal connections but cannot be emitted by the user.

Много тонких моментов, которые нужно учитывать при наследовании от QAbstractItemModel, чтобы не поломалось модель-отображение. Почему beginInsertColumns() не виртуальный? А если я хочу его переопределить и что-то своё там сделать? И по фиг что он посылает сигнал columnsAboutToBeInserted, который приватный и сам я его не могу послать. И зачем его сделали приватным? Им есть что скрывать? Может я лучше разработчиков знаю, когда посылать этот сигнал, а когда не надо.  И пускай разработчики QAbstractItemView подстраиваются под мои хотелки. Я-то умнее их намного Улыбающийся.
Записан

Пока сам не сделаешь...
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #104 : Сентябрь 29, 2015, 16:05 »

По SomeCrap как такой вариант?

Код
C++ (Qt)
class SomeCrap
{
public:
   virtual double GetSomeShit() const = 0;
};
 
class SomeConcreteCrap : public SomeCrap
{
private:
   virtual double GetSomeShit() const
   { return CalculateSomeShit(); }
 
protected:
   virtual double CalculateSomeShit() const;
 
double GetShitValue() const { return m_shitValue; }
 
private:
   double m_shitValue;
};

Этих ConcreteCrap'ов может быть хоть мильён, каким надо таким и инициализируй SomeCrap.  И пользователям SomeCrap не важно, как внутренности ConcreteCrap'а устроены, что там приватно, что публично, можно ли от него наследоваться или нет, есть там поля m_shitValue или всё магией создаётся. Главное чтобы в GetSomeShit() возвращалось ожидаемое по логике класса значение.
Записан

Пока сам не сделаешь...
Страниц: 1 ... 5 6 [7] 8 9 ... 16   Вверх
  Печать  
 
Перейти в:  


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