Итак, мой вопрос: почему я все еще могу назвать Go_XXX_Your_Self () и Identify_Your_Self () даже после удаления объекта?
blockquote>Из-за undefined behavior .
Как это работает на C ++? (есть ли даже после его удаления?)
blockquote>Из-за неопределенного поведения . Нет гарантии, что он будет работать одинаково на других реализациях. Опять же, неопределенное поведение .
Также вы можете проверить, нет ли там этого? (Я знаю, что теоретически невозможно, но мне любопытно посмотреть, какие методы там)
blockquote>delete MC1; MC1 = nullptr;
Установив указатель на
nullptr
послеdelete
, он время выполнения, скорее всего, обнаружит, что вы получаете доступ к недействительному местоположению, которое вы не имеете права использовать. Кроме того, тщательно выполняя это для всех применимых указателей, вы можете проверить, действителен ли объект или нет (действителен, если неnullptr
).if(my_ptr) { // my_ptr is most possibly valid (though you can still go wrong) // use my_ptr }
Аналогичным образом, вы также должны установить raw указатели на
nullptr
, если они еще не инициализированы каким-либо действительным адресом.MyClass* some_ptr = nullptr; ...
Но опять же, если у вас есть доступ к современным средствам C ++ 11, гораздо лучше не использовать raw указатели вообще, и просто используйте
std::unique_ptr
илиstd::shared_ptr
(в зависимости от вашей требуемой семантики). И в будущих стандартных версиях C ++ вы также можете использовать предложенныйstd::exempt_ptr
, который является не владеющей, наблюдательной оболочкой-указателем.
Вложенный запрос может сделать задание.
SELECT author_last_name, dewey_number, NumOccurrences
FROM author INNER JOIN
( SELECT author_id, dewey_number, COUNT(dewey_number) AS NumOccurrences
FROM book
GROUP BY author_id, dewey_number
HAVING ( COUNT(dewey_number) > 1 ) ) AS duplicates
ON author.id = duplicates.author_id
(я не знаю - ли это самый быстрый способ достигнуть того, что Вы хотите.)
Обновление: Здесь мои данные
SELECT * FROM author;
id | author_last_name
----+------------------
1 | Fowler
2 | Knuth
3 | Lang
SELECT * FROM book;
id | author_id | dewey_number | title
----+-----------+--------------+------------------------
1 | 1 | 600 | Refactoring
2 | 1 | 600 | Refactoring
3 | 1 | 600 | Analysis Patterns
4 | 2 | 600 | TAOCP vol. 1
5 | 2 | 600 | TAOCP vol. 1
6 | 2 | 600 | TAOCP vol. 2
7 | 3 | 500 | Algebra
8 | 3 | 500 | Undergraduate Analysis
9 | 1 | 600 | Refactoring
10 | 2 | 500 | Concrete Mathematics
11 | 2 | 500 | Concrete Mathematics
12 | 2 | 500 | Concrete Mathematics
И здесь результат вышеупомянутого запроса:
author_last_name | dewey_number | numoccurrences
------------------+--------------+----------------
Fowler | 600 | 4
Knuth | 600 | 3
Knuth | 500 | 3
Lang | 500 | 2
Вы, вероятно, хотите это
SELECT dewey_number, author_last_name,
COUNT(dewey_number) AS NumOccurrences
FROM book
GROUP BY dewey_number,author_last_name
HAVING ( COUNT(dewey_number) > 1 )
SELECT dewey_number, author_last_name,
COUNT(dewey_number) AS NumOccurrences
FROM book
JOIN author USING (author_id)
GROUP BY dewey_number,author_last_name
HAVING COUNT(dewey_number) > 1
, Если книга author_id может быть пустой тогда, изменяют соединение на:
LEFT OUTER JOIN author USING (author_id)
, Если author_id столбец имеет другое имя в каждой таблице тогда, Вы не можете использовать ИСПОЛЬЗУЯ, использовать НА вместо этого:
JOIN author ON author.id = book.author_id
или
LEFT OUTER JOIN author ON author.id = book.author_id
select author_name,dewey_number,Num_of_occur
from author a,(select author_id,dewey_number,count(dewey_number) Num_of_occur
from book
group by author_id,dewey_number
having count(dewey_number) > 1) dup
where a.author_id = dup.author_id