1. C++ / Говнокод #11620

    +20

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    #include <iostream>
    #include <boost/noncopyable.hpp>
    #include <assert.h>
    
    using namespace std;
    
    class noncopyable
      {
       protected:
          noncopyable() {}
         virtual ~noncopyable() {}
       private:  // emphasize the following members are private
          noncopyable( const noncopyable& );
          virtual const noncopyable& operator=( const noncopyable& )final = delete;
      };
    
    class T: public noncopyable
    {
    public:
       const T& operator=( const T& ){return *this;}
    };
    
    int main() {
       T a;
       a=T();
       std::cout<<"kokoko"<<std::endl;
       return 0;
    }

    http://liveworkspace.org/code/15b5716e7618cc75a6881dfdd46982d5

    В чем смысл =delete, если запретить копировать T все равно не удается? Или это ошибка не стандарта, а реализации gcc?

    Запостил: HaskellGovno, 20 Августа 2012

    Комментарии (18) RSS

    • С бустом таже фигня:
      http://liveworkspace.org/code/62f5593a8e842b0ac3c67cd38308bc5e
      Ответить
      • http://liveworkspace.org/code/e721b097c835531ad0c2792c9f1d7851

        Так тоже не заработает, что в общемто логично. Я сдаюсь.
        Как надежно запретить оператор копирования? С конструктором все просто. Запретил и все, а тут никак...
        Ответить
        • http://liveworkspace.org/code/d2f4eda71209202e2d39159e8d98285b
          Я вообще мудак и по лоховски ошибся, но все равно не работает. Надоело помечать ссылки. вручную. Напишите мне скрипт или пусть страйко все фичи, что недавно запилил, отремонтирует. У меня все сломалось.
          Ответить
    • виртуальный оператор присваивания? телл ми моар

      ну а boost::noncopyable нужен не для того, чтобы кому то в иерархии запретить его доопределить, а для того, чтоб гадкий компилятор не создал его по умолчанию (и, тем более, не ругался на свои же ошибки в своем тривиальном присваивании)
      Ответить
      • > а для того, чтоб гадкий компилятор не создал его по умолчанию
        Вот так новости... А запретить до определять в потомке видимо никак? КРЕСТОПРОБЛЕМЫ
        Ответить
        • тут такое дело
          я не спроста обратил внимание на виртуальное присваивание
          сравни свой оригинал пост с вот таким вариантом
          http://liveworkspace.org/code/993caff120b93f79ced1795f14e4d4ba
          Ответить
          • Да знаю это я, капитан.
            Ты вот лучше скажи, как operator= перегружать запретить в потомке?
            Ответить
            • никак
              можешь попытаться запретить наследоваться от себя (final class в С++11)

              это академический интерес или такая идейная рахитектура, запретить потомку всё что можно?
              Ответить
              • Лол, мне нужно не запретить наследоваться от себя, а запретить копирование класса.
                Ответить
                • вот я и спрашиваю - зачем?
                  это абсолютно дело потомка будет ли он копироваться сам от себя или не будет, ему это дело виднее - ты ведь разрешил наследоваться, завещание написал - давай до свидания
                  Ответить
                  • Я чувствую шаткий пол ногами... Завещание... Ты меня расстроел. :/
                    Ответить
              • Похимичить с модификатором доступа для конкретного метода в промежуточном классе?
                Ответить
                • http://ideone.com/SAJDJ
                  Ответить
                  • http://ideone.com/fguuv
                    Ответить
                    • невиртуальный приватный метод для классов наследников просто не существует, поэтому этим способом вообще ничего не запретить
                      Ответить
                      • Да, никак.
                        C++ - уровень доступа к членам в производном классе в любую сторону.
                        Java - только в сторону повышения уровня доступа.
                        Ответить
            • Эх 'final', где же ты?
              В каком стандарте ждать тебя?
              Ответить
              • С++11, но как видишь он себя оправдывает недостаточно.
                Ответить

    Добавить комментарий