Что такое нарезка объектов?

В коде ответа:

function extractUrlValue(key, url)
{
    if (typeof(url) === 'undefined')
        url = window.location.href;
    var match = url.match('[?&]' + key + '=([^&#]+)');
    return match ? match[1] : null;
}

Если key является последним параметром в URL-адресе, а после этого есть якорь - он вводит код, верните value#anchor в качестве значения. # в regexp '[?&]' + key + '=([^&#]+)' предотвратит это.

690
задан Cœur 13 November 2018 в 10:37
поделиться

7 ответов

"Разрезание" состоит в том, где Вы присваиваете объект производного класса к экземпляру базового класса, таким образом, теряя часть информации - часть его "нарезана" далеко.

, Например,

class A {
   int foo;
};

class B : public A {
   int bar;
};

, Таким образом, объект типа B имеет два элемента данных, foo и bar.

Тогда, если необходимо было записать это:

B b;

A a = b;

Тогда информация в b об участнике bar потеряна в a.

572
ответ дан ForceBru 13 November 2018 в 10:37
поделиться

Так... Почему теряет производную информацию плохо?..., потому что автор производного класса, возможно, изменил представление, таким образом, что отрезание дополнительной информации изменяет значение, представленное объектом. Это может произойти, если производный класс, если используется кэшировать представление, которое является более эффективным для определенных операций, но дорогим для преобразования назад к основному представлению.

Также мысль кто-то должен также упомянуть то, что необходимо сделать, чтобы не резать... Получите копию Стандартов Кодирования C++, 101 инструкции по правилам и лучших практик. Контакт с разрезанием является № 54.

, Это предлагает, чтобы несколько сложный шаблон полностью занимался проблемой: имейте защищенного конструктора копии, защищенный чистый виртуальный DoClone и общедоступный Клон с утверждением, которое скажет Вам, если (дальнейшему) производному классу не удалось реализовать DoClone правильно. (Метод Клона делает надлежащую глубокую копию полиморфного объекта.)

можно также отметить конструктора копии на основе, явной, который допускает явное разрезание, если это желаемо.

7
ответ дан Steve Steiner 13 November 2018 в 10:37
поделиться

Если у Вас есть базовый класс A и производный класс B, то можно сделать следующее.

void wantAnA(A myA)
{
   // work with myA
}

B derived;
// work with the object "derived"
wantAnA(derived);

Теперь метод wantAnA потребности копия derived. Однако объект derived не может быть скопирован полностью, поскольку класс B мог изобрести дополнительные членские переменные, которые не находятся в его базовом классе A.

Поэтому для вызова wantAnA, компилятор "отрежет" всех дополнительных членов производного класса. Результатом мог бы быть объект, который Вы не хотели создавать, потому что

  • это может быть неполно,
  • это ведет себя как A - объект (все специальное поведение класса B потеряно).
147
ответ дан Will Vousden 13 November 2018 в 10:37
поделиться

Третье соответствие в Google для "разрезания C++" дает мне эту статью Wikipedia http://en.wikipedia.org/wiki/Object_slicing и это (нагретый, но первые несколько сообщений определяют проблему): http://bytes.com/forum/thread163565.html

, Таким образом, это - при присвоении объекта подкласса к суперклассу. Суперкласс не знает ничего из дополнительной информации в подклассе и не имеет комнаты для хранения его, таким образом, дополнительная информация "отрезана".

, Если те ссылки не дают достаточно информации для "хорошего ответа", редактируют Ваш вопрос сообщить нам то, что больше Вы ищете.

31
ответ дан The Archetypal Paul 13 November 2018 в 10:37
поделиться

Режущая проблема в C++ является результатом семантики значения своих объектов, которые остались главным образом из-за совместимости со структурами C. Необходимо использовать прямую ссылку или синтаксис указателя для достижения "нормального" поведения объекта, найденного на большинстве других языков, которые делают объекты, т.е. объекты всегда раздаются ссылкой.

короткие ответы - то, что Вы нарезаете объект путем присвоения производного объекта базовому объекту значением , т.е. остающийся объект является только частью производного объекта. Для сохранения семантики значения разрезание является разумным поведением и имеет его относительно редкое использование, который не существует на большинстве других языков. Некоторые люди считают его функцией C++, в то время как многие считали его одной из причуд/ошибок C++.

7
ответ дан ididak 13 November 2018 в 10:37
поделиться

Режущая проблема серьезна, потому что она может привести к повреждению памяти, и очень трудно гарантировать, что программа не страдает от нее. Для разработки его из языка классы, которые поддерживают наследование, должны быть доступными ссылкой только (не значением). Язык программирования D имеет это свойство.

Считают класс A и класс B полученными из A. Повреждение памяти может произойти, если часть имеет указатель p и экземпляр B, который указывает на p на B дополнительные данные. Затем когда дополнительные данные отрезаны, p указывает на мусор.

28
ответ дан Walter Bright 13 November 2018 в 10:37
поделиться

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

Если я передаю объект подкласса в качестве параметр для метода, который принимает параметр типа суперкласс, я, конечно, должен знать об этом и знать внутренне, вызываемый метод будет работать только с объектом суперкласса (он же базовый класс).

Мне кажется, только необоснованное ожидание того, что предоставление подкласса, в котором запрашивается базовый класс, каким-то образом приведет к результатам, специфичным для подкласса, вызовет проблему нарезки. Либо плохой дизайн использования метода, либо плохая реализация подкласса. Я предполагаю, что это обычно результат принесения в жертву хорошего ООП-дизайна в пользу целесообразности или увеличения производительности.

4
ответ дан 22 November 2019 в 21:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: