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

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

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

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

19.04.2013, 20:14. Просмотров 1451. Ответов 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...

46
stima
485 / 337 / 38
Регистрация: 22.03.2011
Сообщений: 1,079
Завершенные тесты: 2
20.04.2013, 20:40 #16
Цитата Сообщение от 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
#include <iostream>
 
class A {
    public:
        A(int v) : value(v) {}
    
    static A a;
    static A b;
    static A c;
 
    int value;
 
    private:
        A() : value(-1) {}
 
        
};
 
A A::a;
A A::b(0);
A A::c(1);
 
int main()
{
    std::cout << "a: " << A::a.value << std::endl;
    std::cout << "b: " << A::b.value << std::endl;
    std::cout << "c: " << A::c.value << std::endl;
 
    return 0;
}
Добавлено через 53 секунды
Цитата Сообщение от taras atavin Посмотреть сообщение
Нет. Явное приведение типа - это приведение оператором приведение типа.
как говорится)
Цитата Сообщение от Jupiter Посмотреть сообщение
Не по теме:
Сообщение от taras atavin
учи язык.
трололо
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
20.04.2013, 20:44 #17
Цитата Сообщение от taras atavin Посмотреть сообщение
И как это различие между динамическим и статическим/автоматическим выделением памяти может не иметь значения? Доступ через оператор разыменования, возможность удаления оператором delete, безымянность объекта вместо именованного объекта, доступа без оператор разыменования, гарантированного существования в течении всего сеанса работы экземпляра программы.
> Доступ через оператор разыменования
Синтаксическая разница, не более. (Перегрузка operator->() у хранимого объекта — его проблемы.)

> возможность удаления оператором delete
Можно написать sentinel_ptr, который позволяет только добраться до полей, но не удалять или замещать объект, на который ссылается.

> безымянность объекта вместо именованного объекта
Имя есть у смарт-поинтера, через который с ним оперируют.

> гарантированного существования в течении всего сеанса работы экземпляра программы
А глобальная переменная типа существует не всё время?

Цитата Сообщение от taras atavin Посмотреть сообщение
учи язык.
Вы, я вижу, стандарт наизусть знаете.

Цитата Сообщение от taras atavin Посмотреть сообщение
У сингелтона только один экземпляр и не возможно создание новых, у меня другая задача. Обычный класс, объекты которого можно создавать в произвольном количестве, но дополнительно несколько обязательных экземпляров, существование, имена и значения которых гарантированы и среди этих объектов один выделенный, созданный конструктором, повторный вызов которого не возможен. Остальные объекты создаются другим конструктором, использование которого не ограничено.
В Си++ нельзя динамически создавать переменные. Если у вас гарантированные имена, то они должны быть прописаны в исходнике. Тот вариант с синглтоном подразумевал, что под каждый именованный объект создаётся своя функция get_foo(), возвращающая ссылку на этот объект.
0
stima
485 / 337 / 38
Регистрация: 22.03.2011
Сообщений: 1,079
Завершенные тесты: 2
20.04.2013, 20:49 #18

Не по теме:


Могу поспорить стандарт из вас никто ничитал)))) ... максимум драфт)))



Добавлено через 1 минуту
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
В Си++ нельзя динамически создавать переменные.
Я поправлю, нельзя динамически задавать имя переменной.

Не по теме:


А то как-то совсем грустно)

0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.04.2013, 21:08  [ТС] #19
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
А глобальная переменная типа существует не всё время?
динамическая глобальная переменная существует до принудительного удаления, мне надо, чтоб за удалением следил неявный код, автоматически добавленный компилятором.

Добавлено через 1 минуту
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Вы, я вижу, стандарт наизусть знаете.
Ну ты знаешь. Читай:
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
В Си++ нельзя динамически создавать переменные.
. К твоему сведению, new предназначен именно для динамического создания переменных, как скалярных, так и объектов.

Добавлено через 1 минуту
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Тот вариант с синглтоном подразумевал, что под каждый именованный объект создаётся своя функция get_foo(),
А надо, чтоб имя было у самого объекта.

Добавлено через 1 минуту
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Синтаксическая разница, не более. (Перегрузка operator->() у хранимого объекта — его проблемы.)
и что это даст? К тому же -> с негарантированными безымянными объектами должен работать, как обычно.

Добавлено через 1 минуту
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Если у вас гарантированные имена, то они должны быть прописаны в исходнике.
Динамические переменные безымянны.

Добавлено через 9 минут
Пусть гарантированный объект позвращатся функцией b(), не гарантированные по условию принимают при созднаии ссылки на уже существующие объекты.
C++
1
A z(/здесь надо указать существующих экземпляр A, но z -  первый не гарантированный объект и таких экземпляров нет, есть только функция static A b(); */);
. Кроме того, эта ссылка должна быть сохранена в указателе внутри объекта. Сохранить указатель на функцию? Но дальше я пишу
C++
1
A aa(z);
. Один и тот же указатель не может указывать на функцию и переменную.
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
20.04.2013, 22:20 #20
Цитата Сообщение от taras atavin Посмотреть сообщение
динамическая глобальная переменная существует до принудительного удаления, мне надо, чтоб за удалением следил неявный код, автоматически добавленный компилятором.
unique_ptr автоматически прибьёт объект, за которым он следит, как только ему самому придёт время умирать. Неявно. Он умрёт тогда же, когда и любой другой глобальный объект — при выходе из main. (Опять же, если оставить в стороне dll.)


Цитата Сообщение от taras atavin Посмотреть сообщение
Ну ты знаешь. Читай: . К твоему сведению, new предназначен именно для динамического создания переменных, как скалярных, так и объектов.

А надо, чтоб имя было у самого объекта.
Вы путаете понятия переменной и объекта. Объекты есть в памяти во время выполнения программы. Переменные — это идентификаторы для компилятора, эти самые имена; в Си++ их объективно нет во время выполнения программы.


Дальше у вас идёт какая-то мура про "гарантированные" объекты, безымянные переменные и, внезапно, указатели на функции, которую я не понял.
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.04.2013, 11:35  [ТС] #21
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
unique_ptr автоматически прибьёт объект, за которым он следит, как только ему самому придёт время умирать. Неявно. Он умрёт тогда же, когда и любой другой глобальный объект — при выходе из main. (Опять же, если оставить в стороне dll.)
Допустим. А момент создания? Обычные глобальные объекты создаются неявно на входе в main.

Добавлено через 5 минут
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Вы путаете понятия переменной и объекта. Объекты есть в памяти во время выполнения программы. Переменные — это идентификаторы для компилятора, эти самые имена; в Си++ их объективно нет во время выполнения программы.
Я ничего не путаю, а если уж говорить о низком уровне, то объектов тоже нет во время исполнения, а есть только их скалярные челны-переменные и члены-функции. На высоком же уровне переменная есть ячейка памяти для хранения изменяемых данных, эта ячейка может иметь известное компилятору имя, прописанное в исходном тексте программы и заносимое оттуда на этапе компиляции в таблицу переменных. Так что объекты отличаются от остальных переменных ровно двумя аспектами:
1. Они не скалярны.
2. С ними связан код.
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
21.04.2013, 12:33 #22
Цитата Сообщение от taras atavin Посмотреть сообщение
Допустим. А момент создания? Обычные глобальные объекты создаются неявно на входе в main.
Обычные глобальные объекты инициализируются чёрти когда. Особенно это касается объектов, определяемых в различных единицах трансляции, которые используют друг друга. Немного цитаток:
Definitions of explicitly specialized class template static data members have ordered initialization. Other class template static data members (i.e., implicitly or explicitly instantiated specializations) have unordered initialization.

Otherwise, the initialization of a variable is indeterminately sequenced with respect to the initialization of a variable defined in a different translation unit.

Otherwise, the unordered initialization of a variable is indeterminately sequenced with respect to every other dynamic initialization.

As a consequence, if the initialization of an object obj1 refers to an object obj2 of namespace scope potentially requiring dynamic initialization and defined later in the same translation unit, it is unspecified whether the value of obj2 used will be the value of the fully initialized obj2 (because obj2 was statically initialized) or will be the value of obj2 merely zero-initialized.

It is implementation-defined whether the dynamic initialization of a non-local variable with static storage duration is done before the first statement of main.

It is implementation-defined whether the dynamic initialization of a non-local variable with static or thread storage duration is done before the first statement of the initial function of the thread.
Отдельная функция позволяет инициализировать всё в чётко определённый момент и в чётко определённом порядке, прописанном в этой функции. В отличие от.
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.04.2013, 12:37  [ТС] #23
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Отдельная функция позволяет инициализировать всё в чётко определённый момент и в чётко определённом порядке, прописанном в этой функции. В отличие от.
Отдельную функцию можно вообще забыть вызвать, а если класс буду использовать не я, то можно усомниться даже в знании о необходимости её вызова.

Добавлено через 44 секунды
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Обычные глобальные объекты инициализируются чёрти когда. Особенно это касается объектов, определяемых в различных единицах трансляции, которые используют друг друга. Немного цитаток:
Что такое единицы трансляции?
0
stima
485 / 337 / 38
Регистрация: 22.03.2011
Сообщений: 1,079
Завершенные тесты: 2
21.04.2013, 12:52 #24
Цитата Сообщение от taras atavin Посмотреть сообщение
Что такое единицы трансляции?
Обьектники, читайте про раздельную компиляцию.
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.04.2013, 12:54  [ТС] #25
Цитата Сообщение от stima Посмотреть сообщение
Обьектники, читайте про раздельную компиляцию.
Допустим. Но их создание и инициализация всё равно гарантированы.
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
21.04.2013, 12:59 #26
Цитата Сообщение от taras atavin Посмотреть сообщение
Допустим. Но их создание и инициализация всё равно гарантированы.
А порядок — нет. Претензии именно к нему.

Цитата Сообщение от taras atavin Посмотреть сообщение
Отдельную функцию можно вообще забыть вызвать, а если класс буду использовать не я, то можно усомниться даже в знании о необходимости её вызова.
Если её забыть вызвать, то вы тут же получите null pointer dereference exception при первой же попытке тестирования функционала, использующего эти переменные, а не неопределённое поведение из-за инициализации, выполненной в неправильном порядке.

А пользователь может вообще не знать о существовании каких-то глобальных переменных. Если он по религиозным убеждениям не читает документацию, то пусть выкручивается сам.
0
stima
485 / 337 / 38
Регистрация: 22.03.2011
Сообщений: 1,079
Завершенные тесты: 2
21.04.2013, 13:02 #27
Цитата Сообщение от taras atavin Посмотреть сообщение
Допустим. Но их создание и инициализация всё равно гарантированы.
Не допустим, а так оно и есть). Да.

Добавлено через 1 минуту
Ваше решение должно происходить не с точки зрения компиляции, а сточки зрения архитектуры приложения. Вы не стой стороны смотрите.
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.04.2013, 13:44  [ТС] #28
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
А порядок — нет. Претензии именно к нему.
Во-первых нафиг мне вообще этот порядок? Пусть хоть одновременно создаются. А во-вторых один из параметров конструктора - ссылка на существующий объект. Каким образом может быть нарушен порядок создания и инициализации объектов, если один из них инициируется с использованием ссылки на другой?
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
21.04.2013, 15:09 #29
То, что объект есть, ещё не значит, что он инициализирован. О возможности косячной инициализации прямым текстом сказано в стандарте, там даже пример есть. И в моей цитате этот кусок тоже есть.

Смотрите, вот есть такие файлы:
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
49
50
51
52
53
54
55
56
57
58
59
/* == cpp1.h ==== */
#ifndef CPP1_H_
#define CPP1_H_
 
struct A {
    int m_x;
 
    A(int x) : m_x(x) {}
};
 
extern A global1;
 
#endif // CPP1_H_
 
 
/* == cpp1.cpp ==== */
#include "cpp1.h"
 
A global1(42);
 
 
/* == cpp2.h ==== */
 
#ifndef CPP2_H_
#define CPP2_H_
 
#include "cpp1.h"
 
struct B {
    int m_x;
 
    B(const A &a) : m_x(a.m_x) {}
};
 
extern B global2;
 
#endif // CPP2_H_
 
 
/* == cpp2.cpp ==== */
 
#include "cpp2.h"
#include "cpp1.h"
 
B global2(global1);
 
 
/* == main.cpp ==== */
 
#include <iostream>
 
#include "cpp1.h"
#include "cpp2.h"
 
int main()
{
    std::cout << global1.m_x << "\n";
    std::cout << global2.m_x << "\n";
}
Теперь мы их компилим:
Код
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
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.04.2013, 18:32  [ТС] #30
Вы ещё предложите готовый экзешник хексом криво отредактировать.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2013, 18:32
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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