Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
#1

Как это сделать? - C++

19.04.2013, 20:14. Просмотров 1438. Ответов 46
Метки нет (Все метки)

Класс, у него несколько гарантированных экземпляров, из них ровно один создан конструктором по умолчанию, средствами языка запрещено создавать другие экземпляры конструктором по умолчанию, но можно создавать дополнительные экземпляры конструкторами с параметрами, любой экземпляр может быть приведён к std::string, или без приведения выведен в поток std::cout, все поля private, единственный public конструктор принимает два дабла, std::string и ссылку на собственный класс, которая в том числе может ссылаться на экземпляр, созданный конструктором по умолчанию.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.04.2013, 20:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как это сделать? (C++):

нужно создать таблицу из 3 строк и 4 столбцов и заполнить её (любой информацией,это неважно) . Как это можно сделать ? - C++
Здравствуйте.У меня возникла проблема. Помогите пожалуйста!Модуль в понедельник , про таблицы ничего не рассказывали , а преподаватель...

Как это сделать? - C++
Предположим, есть некоторый класс, например, TTrigonometricComplex и я хочу сделать нём функции, которые будут доступны в левой части...

Как это сделать ? [c++] - C++
Вот допустим у меня есть функция inline void fun(char* аргумент1, char *аргумент2) и есть 2 функция fun("аргумент1 ",...

Как это сделать? - C++
Как написать прогу, которая бы указывала количество слов в предложении, вводимое пользователем?

Как это сделать? - C++
Нужно заменить цифры в числе на ноль, если цифра равна "a". А затем вывести получившееся число. число N - натуральное, а - является...

Как это сделать - C++
У меня такой код #include <iostream> using namespace std; #include <conio.h> int main(){ char input = 'a'; double...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
21.04.2013, 20:20 #31
Любая другая среда сборки компилирует программы точно так же, здесь нет ни одного выстреливающего в ногу действия. Вы уж как знаете, а лично я не хочу, чтобы поведение моих программ зависело от того, в каком порядке линкер получает объектники.
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
22.04.2013, 09:10  [ТС] #32
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
здесь нет ни одного выстреливающего в ногу действия.
А смена порядка?
0
vxg
Модератор
3162 / 1965 / 220
Регистрация: 13.01.2012
Сообщений: 7,523
22.04.2013, 13:15 #33
о! какая тема! а я все почти пропустил(
мне кажется, что это
Цитата Сообщение от taras atavin Посмотреть сообщение
средствами языка запрещено создавать другие экземпляры конструктором по умолчанию
невозможно. а вообще выглядит как фабрика классов - один объект производящий все остальные + приведение типа.
Цитата Сообщение от taras atavin Посмотреть сообщение
ссылку на собственный класс, которая в том числе может ссылаться на экземпляр, созданный конструктором по умолчанию
а это вообще как? если ссылка не на единственный в своем роде объект, то на какой? и зачем в конструктор вообще передавать ссылку?
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
22.04.2013, 13:27  [ТС] #34
Цитата Сообщение от vxg Посмотреть сообщение
невозможно. а вообще выглядит как фабрика классов - один объект производящий все остальные + приведение типа.
С какого он производящий то?

Добавлено через 47 секунд
Цитата Сообщение от vxg Посмотреть сообщение
невозможно.
Почему же в сингелтоне возможно?

Добавлено через 2 минуты
Цитата Сообщение от vxg Посмотреть сообщение
а это вообще как? если ссылка не на единственный в своем роде объект, то на какой
У меня не сингелтон. При создании второго ссылка на первый, при создании третьего на любой из первых двух, четвертого - из первых трёх и так далее. При это n первых объектов надо создать таким образом заранее при разработке класса, а остальные прописываются уже в приложении. Первый - единственный, не принимающий ссылок.

Добавлено через 1 минуту
Цитата Сообщение от vxg Посмотреть сообщение
и зачем в конструктор вообще передавать ссылку?
Ну это класс коряги, знающий все её узлы, потомки содержат указатели на предков. Как их ещё инициализировать? И надо гарантировать, что коряга будет ровно одна, а не саксауловы заросли.
0
vxg
Модератор
3162 / 1965 / 220
Регистрация: 13.01.2012
Сообщений: 7,523
22.04.2013, 13:59 #35
Цитата Сообщение от taras atavin Посмотреть сообщение
Почему же в сингелтоне возможно
этого, как и слова сингелтон, я не знаю
делаем так что бы можно было работать только с динамически созданными объектами.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
class node
{
private:
    //поля объекта
    double x;
    double y;
    std::string s;
    node *parent;
 
    //запрещаем создание объектов при помощи конструктора по умолчанию и конструктора копирования
    node(void) {}
    node(const node&) {}
 
    //запрещаем операцию присваивания
    const node &operator =(const node &) {}
 
public:
    static node *root;
 
    static node *create(const double &x, const double &y, const std::string &s, node *parent = 0)
    {
        node *res = 0;
        if (!root)
        {
            if (!parent)
            {
                res = new node;
                res->x = x;
                res->y = y;
                res->s = s;
                res->parent = res;
 
                root = res;
            }
        }
        else if (parent)
        {
            res = new node;
            res->x = x;
            res->y = y;
            res->s = s;
            res->parent = parent;
        }
        return res;
    }
};
 
node *node::root = 0;
Добавлено через 2 минуты
при создании объекта для неправильных объектов будет возвращаться 0. как вариант без динамического создания: выброс исключения из конструктора, но это ад
1
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
22.04.2013, 14:15  [ТС] #36
Цитата Сообщение от vxg Посмотреть сообщение
выброс исключения из конструктора
А можно при этом выдать мессагу, что не так?

Добавлено через 9 минут
И можно реализацию заранее скомпилить с готовыми экземплярами, которые требуется гарантировать, а потом использовать уже lib, или obj?
0
vxg
Модератор
3162 / 1965 / 220
Регистрация: 13.01.2012
Сообщений: 7,523
22.04.2013, 14:41 #37
Цитата Сообщение от taras atavin Посмотреть сообщение
А можно при этом выдать мессагу, что не так
при выбросе (кроме собственно падения программы если выброс нигде не будет словлен) можно сделать все что угодно.
Цитата Сообщение от taras atavin Посмотреть сообщение
И можно реализацию заранее скомпилить с готовыми экземплярами
этого не понял вообще. где-то в программе человек пишет
C++
1
2
3
    node *a = node::create(1, 2, "a", 0); //мы создали root объект
    node *b = node::create(3, 4, "b", 0); //если мы попытаемся еще раз подсунуть в качестве parent ноль (то есть создать еще один root объект) объект не будет создан - будет возвращен ноль
    node *c = node::create(5, 6, "c", a); //а вот так - все нормально
Добавлено через 2 минуты
...а вообще какая-то странная задача. похожа на поиск ошибки при помощи перфоратора... вы по определению не должны создавать еще одного дерева если так задумана архитектура. если вы пытаетесь создать еще одно дерево - у вас не правильный код. отлов ошибок такого рода вмонтированием в класс таких надстроек как то не очень красив
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
22.04.2013, 14:42  [ТС] #38
Цитата Сообщение от vxg Посмотреть сообщение
где-то в программе человек пишет
* * node *a = node::create(1, 2, "a", 0); //мы создали root объект
* * node *b = node::create(3, 4, "b", 0); //если мы попытаемся еще раз подсунуть в качестве parent ноль (то есть создать еще один root объект) объект не будет создан - будет возвращен ноль
* * node *c = node::create(5, 6, "c", a); //а вот так - все нормально
Какой ноль?
C++
1
2
3
4
5
6
7
8
9
class A
{
 ...
 private:
 A(); 
...
 public:
 A(A &Base, double k, std::string t);
...
.
0
vxg
Модератор
3162 / 1965 / 220
Регистрация: 13.01.2012
Сообщений: 7,523
22.04.2013, 14:46 #39
...во всяком случае если подобная ошибка не возникает в результате интерактивных действий пользователя (например, он руками строит какието деревья). но в этом случае мы должны помешать ему другим способом и в описанном механизме нет нужды

Добавлено через 35 секунд
ноль - это для варианта когда есть только динамические объекты = есть только указатели.

Добавлено через 1 минуту
если нужен вариант без динамики то либо создавать специальный объект инвалид и после создания при необходимости использовать метод "я_инвалид" либо выбрасывать исключение из конструктора при передаче некорректных параметров

Добавлено через 1 минуту
...интересно должно быть у вас дерево строится на ссылках... получается?
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
22.04.2013, 15:11  [ТС] #40
Цитата Сообщение от vxg Посмотреть сообщение
...интересно должно быть у вас дерево строится на ссылках... получается?
Так я и говорю, что это коряга.
0
vxg
Модератор
3162 / 1965 / 220
Регистрация: 13.01.2012
Сообщений: 7,523
22.04.2013, 15:19 #41
Цитата Сообщение от taras atavin Посмотреть сообщение
коряга
многозначное слово. я имею ввиду поле объекта хранящее родителя у вас что? ссылка (не указатель)? т.е. вы не можете перемещать объекты т.к. ссылка может быть присвоена только при создании объекта? это удобно? или так и задумано?
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
22.04.2013, 15:41  [ТС] #42
Цитата Сообщение от vxg Посмотреть сообщение
поле объекта хранящее родителя у вас что? ссылка (не указатель)
Как раз указатель, адрес берётся внутри конструктора.

Добавлено через 49 секунд
Цитата Сообщение от vxg Посмотреть сообщение
многозначное слово.
Ну дерево, только очень кривое. Саксаул копчёный.

Добавлено через 1 минуту
Цитата Сообщение от vxg Посмотреть сообщение
вы не можете перемещать объекты т.к. ссылка может быть присвоена только при создании объекта? это удобно? или так и задумано?
Так задумано.
0
vxg
Модератор
3162 / 1965 / 220
Регистрация: 13.01.2012
Сообщений: 7,523
22.04.2013, 16:20 #43
фразы
Цитата Сообщение от taras atavin Посмотреть сообщение
Как раз указатель
Цитата Сообщение от taras atavin Посмотреть сообщение
Так задумано
противоречат друг другу. в объекте
C++
1
node &parent;
или
C++
1
node *parent;
Добавлено через 3 минуты
...как вариант для этапа разработки сделать такой ад: определять макросом. для root объекта использовать свой макрос. для остальных - свой. в макросе root объекта смотреть не определена ли ROOT... видите, какой маразм - все свелось к тому что в тексте программы не должно быть двух DEFINE_ROOT()
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
22.04.2013, 16:35  [ТС] #44
Цитата Сообщение от vxg Посмотреть сообщение
противоречат друг другу. в объекте
Код C++
1
node &parent;
или
Код C++
1
node *parent;
в объекте
C++
1
A *based;
, в конструкторе
C++
1
2
3
A::A(A &based...)
{
 this->based=&based;
, а задумано, что они не должны перемещаться.
0
vxg
Модератор
3162 / 1965 / 220
Регистрация: 13.01.2012
Сообщений: 7,523
22.04.2013, 16:49 #45
если дерево постоянное нужно либо
C++
1
const node *parent;
либо
C++
1
node &parent;
а вообще ацки опасная вещь ибо человек может подобавлять локальных объектов в дерево. хотя я не знаю как оно там у вас. так что по поводу варианта? не?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.04.2013, 16:49
Привет! Вот еще темы с ответами:

Как это сделать? - C++
Дан файл F, содержащий сведения об игрушках: название, стоимость, возрастные границы детей, для которых игрушка предназначена. Найти...

как это сделать - C++
вы мне можете помочь, никак не могу понять как это вбить в СИ??? "x-x^/3!+x^/5!+.. . + x^^"'^^V(2n + l)! Функция sh(x) " как это...

как это сделать - C++
помогите, погибаю!!! тема: заставка(screan sever)? сменяющая картинки из списка особенности: поддержка эффектов смены, формирование...

Как сделать это задание? - C++
Определить номер первого из чисел sin x, sin(sin x), sin(sin(sin x)),.., меньшего по модулю 10^-3.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
22.04.2013, 16:49
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru