4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
1 | |
Как это сделать?19.04.2013, 20:14. Показов 2476. Ответов 46
Метки нет (Все метки)
Класс, у него несколько гарантированных экземпляров, из них ровно один создан конструктором по умолчанию, средствами языка запрещено создавать другие экземпляры конструктором по умолчанию, но можно создавать дополнительные экземпляры конструкторами с параметрами, любой экземпляр может быть приведён к std::string, или без приведения выведен в поток std::cout, все поля private, единственный public конструктор принимает два дабла, std::string и ссылку на собственный класс, которая в том числе может ссылаться на экземпляр, созданный конструктором по умолчанию.
0
|
19.04.2013, 20:14 | |
Ответы с готовыми решениями:
46
нужно создать таблицу из 3 строк и 4 столбцов и заполнить её (любой информацией,это неважно) . Как это можно сделать ? Как понять, как это делать и как это сделать? как это сделать сделать? вообще не понимаю как это сделать |
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
21.04.2013, 11:35 [ТС] | 21 |
Допустим. А момент создания? Обычные глобальные объекты создаются неявно на входе в main.
Добавлено через 5 минут Я ничего не путаю, а если уж говорить о низком уровне, то объектов тоже нет во время исполнения, а есть только их скалярные челны-переменные и члены-функции. На высоком же уровне переменная есть ячейка памяти для хранения изменяемых данных, эта ячейка может иметь известное компилятору имя, прописанное в исходном тексте программы и заносимое оттуда на этапе компиляции в таблицу переменных. Так что объекты отличаются от остальных переменных ровно двумя аспектами: 1. Они не скалярны. 2. С ними связан код.
0
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
21.04.2013, 12:33 | 22 |
Обычные глобальные объекты инициализируются чёрти когда. Особенно это касается объектов, определяемых в различных единицах трансляции, которые используют друг друга. Немного цитаток:
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
21.04.2013, 12:37 [ТС] | 23 |
Отдельную функцию можно вообще забыть вызвать, а если класс буду использовать не я, то можно усомниться даже в знании о необходимости её вызова.
Добавлено через 44 секунды Что такое единицы трансляции?
0
|
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
|
|
21.04.2013, 12:52 | 24 |
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
21.04.2013, 12:54 [ТС] | 25 |
0
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
21.04.2013, 12:59 | 26 |
А порядок — нет. Претензии именно к нему.
Если её забыть вызвать, то вы тут же получите null pointer dereference exception при первой же попытке тестирования функционала, использующего эти переменные, а не неопределённое поведение из-за инициализации, выполненной в неправильном порядке. А пользователь может вообще не знать о существовании каких-то глобальных переменных. Если он по религиозным убеждениям не читает документацию, то пусть выкручивается сам.
0
|
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
|
|
21.04.2013, 13:02 | 27 |
Не допустим, а так оно и есть). Да.
Добавлено через 1 минуту Ваше решение должно происходить не с точки зрения компиляции, а сточки зрения архитектуры приложения. Вы не стой стороны смотрите.
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
21.04.2013, 13:44 [ТС] | 28 |
Во-первых нафиг мне вообще этот порядок? Пусть хоть одновременно создаются. А во-вторых один из параметров конструктора - ссылка на существующий объект. Каким образом может быть нарушен порядок создания и инициализации объектов, если один из них инициируется с использованием ссылки на другой?
0
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
||||||
21.04.2013, 15:09 | 29 | |||||
То, что объект есть, ещё не значит, что он инициализирован. О возможности косячной инициализации прямым текстом сказано в стандарте, там даже пример есть. И в моей цитате этот кусок тоже есть.
Смотрите, вот есть такие файлы:
Код
c:\Tmp>g++ -c cpp1.cpp c:\Tmp>g++ -c cpp2.cpp c:\Tmp>g++ -c main.cpp Код
c:\Tmp>g++ main.o cpp2.o cpp1.o && a.exe 42 42 c:\Tmp>g++ main.o cpp1.o cpp2.o && a.exe 42 0
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
21.04.2013, 18:32 [ТС] | 30 |
Вы ещё предложите готовый экзешник хексом криво отредактировать.
0
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
21.04.2013, 20:20 | 31 |
Любая другая среда сборки компилирует программы точно так же, здесь нет ни одного выстреливающего в ногу действия. Вы уж как знаете, а лично я не хочу, чтобы поведение моих программ зависело от того, в каком порядке линкер получает объектники.
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
22.04.2013, 09:10 [ТС] | 32 |
0
|
Модератор
3388 / 2160 / 352
Регистрация: 13.01.2012
Сообщений: 8,378
|
|
22.04.2013, 13:15 | 33 |
о! какая тема! а я все почти пропустил(
мне кажется, что это невозможно. а вообще выглядит как фабрика классов - один объект производящий все остальные + приведение типа. а это вообще как? если ссылка не на единственный в своем роде объект, то на какой? и зачем в конструктор вообще передавать ссылку?
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
22.04.2013, 13:27 [ТС] | 34 |
С какого он производящий то?
Добавлено через 47 секунд Почему же в сингелтоне возможно? Добавлено через 2 минуты У меня не сингелтон. При создании второго ссылка на первый, при создании третьего на любой из первых двух, четвертого - из первых трёх и так далее. При это n первых объектов надо создать таким образом заранее при разработке класса, а остальные прописываются уже в приложении. Первый - единственный, не принимающий ссылок. Добавлено через 1 минуту Ну это класс коряги, знающий все её узлы, потомки содержат указатели на предков. Как их ещё инициализировать? И надо гарантировать, что коряга будет ровно одна, а не саксауловы заросли.
0
|
Модератор
3388 / 2160 / 352
Регистрация: 13.01.2012
Сообщений: 8,378
|
||||||
22.04.2013, 13:59 | 35 | |||||
этого, как и слова сингелтон, я не знаю
делаем так что бы можно было работать только с динамически созданными объектами.
при создании объекта для неправильных объектов будет возвращаться 0. как вариант без динамического создания: выброс исключения из конструктора, но это ад
1
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
22.04.2013, 14:15 [ТС] | 36 |
А можно при этом выдать мессагу, что не так?
Добавлено через 9 минут И можно реализацию заранее скомпилить с готовыми экземплярами, которые требуется гарантировать, а потом использовать уже lib, или obj?
0
|
Модератор
3388 / 2160 / 352
Регистрация: 13.01.2012
Сообщений: 8,378
|
||||||
22.04.2013, 14:41 | 37 | |||||
при выбросе (кроме собственно падения программы если выброс нигде не будет словлен) можно сделать все что угодно.
этого не понял вообще. где-то в программе человек пишет
...а вообще какая-то странная задача. похожа на поиск ошибки при помощи перфоратора... вы по определению не должны создавать еще одного дерева если так задумана архитектура. если вы пытаетесь создать еще одно дерево - у вас не правильный код. отлов ошибок такого рода вмонтированием в класс таких надстроек как то не очень красив
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||||
22.04.2013, 14:42 [ТС] | 38 | |||||
Какой ноль?
0
|
Модератор
3388 / 2160 / 352
Регистрация: 13.01.2012
Сообщений: 8,378
|
|
22.04.2013, 14:46 | 39 |
...во всяком случае если подобная ошибка не возникает в результате интерактивных действий пользователя (например, он руками строит какието деревья). но в этом случае мы должны помешать ему другим способом и в описанном механизме нет нужды
Добавлено через 35 секунд ноль - это для варианта когда есть только динамические объекты = есть только указатели. Добавлено через 1 минуту если нужен вариант без динамики то либо создавать специальный объект инвалид и после создания при необходимости использовать метод "я_инвалид" либо выбрасывать исключение из конструктора при передаче некорректных параметров Добавлено через 1 минуту ...интересно должно быть у вас дерево строится на ссылках... получается?
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
22.04.2013, 15:11 [ТС] | 40 |
0
|
22.04.2013, 15:11 | |
22.04.2013, 15:11 | |
Помогаю со студенческими работами здесь
40
Как это сделать? Как это сделать ? [c++] Как это сделать? Как это сделать? Как это сделать Как это сделать? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |