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

C++

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

Запреты - C++

25.02.2010, 04:30. Просмотров 722. Ответов 7
Метки нет (Все метки)

1. Можно ли запретить:
1.1. Создание локальных экземпляров класса,
1.2. Создание динамических экземпляров класса?
2. Если можно, то как запретить:
2.1. Создание локальных экземпляров класса,
2.2. Создание динамических экземпляров класса?
Требуется что-то такое написать, после чего
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
 #define n ... // некая целая константа
class a { ...}; // Некий класса,
a obj1; // можно
a *pobj1=&obj1; // можно
a *pobj2=new a; // нельзя
a *pobj3; // можно,
a *pobj4; // можно,
a *pobj5; // можно,
a *pobj6=new a[n]; // нельзя
pobj3=obj1; //можно
pobj4=new a; // нельзя
pobj5=new a[n]; // нельзя
void func () // некая функция
{
 a obj2; // нельзя
 a *pobj1=&obj1; // можно
 a *pobj2=new a; // нельзя
 a *pobj3; // можно,
 a *pobj4; // можно,
 a *pobj5; // можно,
 a *pobj6=new a[n]; // нельзя
 pobj3=obj1; //можно
 pobj4=new a; // нельзя
 pobj5=new a[n]; // нельзя
}
.
Что именно требуется написать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.02.2010, 04:30     Запреты
Посмотрите здесь:

Запреты
Запреты в России
Как вставлять запреты на сайты Visual Basic .NET
запреты psr PHP
JavaScript Соединить запреты обработки
Windows 10 Как настроить запреты для юзера на установку программ и на изменение системных настроек?

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vladimir bragin
1 / 1 / 0
Регистрация: 25.02.2010
Сообщений: 3
25.02.2010, 16:13     Запреты #2
Тарас Саныч, я точно не пойму, что ты хотел сказать, но статические объекты создаются в стеке не зависимо от того, объявляются ли они в теле функции или в глобальных переменных, поэтому запретить создание таких объектов в теле функции и разрешить в глобальных переменных нельзя.

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

Добавлено через 2 минуты
Тарас Саныч, я точно не пойму, что ты хотел сказать, но статические объекты создаются в стеке не зависимо от того, объявляются ли они в теле функции или в глобальных переменных, поэтому запретить создание таких объектов в теле функции и разрешить в глобальных переменных нельзя.
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,327
25.02.2010, 16:27     Запреты #3
1. Можно ли запретить:
1.1. Создание локальных экземпляров класса,
Можно. Достаточно объявить закрытым или защищенным деструктор этого класса. Учти, что при этом статические и автоматические объекты не будут создаваться (точнее, соответствующий код просто не скомпилируется). Единственным способом останется использование производящих и разрушающих функций.
1.2. Создание динамических экземпляров класса?
Можно. Точно так же - закрыть/защитить operator new/delete (в соответствуюущих формах) для этого класса.
vladimir bragin
1 / 1 / 0
Регистрация: 25.02.2010
Сообщений: 3
25.02.2010, 17:10     Запреты #4
К стати, то о чём мы говорили, как я понял, может иметь следующее решение
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
60
#include <stdio.h>
#include <cstring>
 
static const char * const publicname = "Class identifier";
 
class a
{
public:
    a(const char *);
    const char * name();
private:
    ~a();
    char * _className;
    static void * operator new(size_t) { return NULL; }
    static void operator delete(void *) {}
    // Следующие операторы можно и не закрывать, так как нет конструктора без параметров
    static void * operator new[](size_t) { return NULL; }
    static void operator delete[](void *) {}
 
    static a _instance;
 
public:
    static a * globalInstance();
};
 
a a::_instance(publicname);
 
a::a(const char *name)
{
    _className = new char[strlen(name)];
    strcpy(_className, name);
}
 
a::~a()
{
    delete _className;
}
 
a * a::globalInstance()
{
    return &_instance;
}
 
const char * a::name()
{
    return _className;
}
 
int main()
{
    a *anObject = a::globalInstance();
    printf("a single instance: %s", anObject->name()); // Работает. Выходит то, что и ожидаем.
 
    /* Следующие код не компилируется, как и ожидается.
    a obj2;
    a *pobj2=new a;
    pobj4=new a;
    */
    return 0;
}
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
26.02.2010, 04:35  [ТС]     Запреты #5
Цитата Сообщение от CheshireCat Посмотреть сообщение
Достаточно объявить закрытым или защищенным деструктор этого класса.
. Не подходит. А если я сделаю конструкторы только с параметрами, это поможет? И можно сделать необъявленными
C++
1
...operator =...
,
C++
1
...operator +...
,
C++
1
...operator -...
,
C++
1
...operator >...
,
C++
1
...operator <...
,
C++
1
...operator >=...
,
C++
1
...operator <=...
,
C++
1
...operator +=...
,
C++
1
...operator -=...
,
C++
1
...operator *=...
,
C++
1
...operator /=...
,
C++
1
...operator ++...
,
C++
1
...operator --...
,
C++
1
a(a& x);
,
C++
1
...operator new ...
,
C++
1
...operator delete ...
? То есть чтоб компил за меня ничего из этого не создавал?
Цитата Сообщение от vladimir bragin Посмотреть сообщение
a::globalInstance();
Это статик?
Цитата Сообщение от vladimir bragin Посмотреть сообщение
Следующие код не компилируется, как и ожидается.
C++
1
a obj2;
. Это тоже не обязательно компилить. В том, что я сейчас пишу это компилиться не должно в первую очередь. А это должно:
C++
1
2
3
4
a obj1("ёклмн");
a obj2(obj1, 308, 44, "ёпрст");
a obj3(obj1, 432.34, 231.4, "что попало");
a obj4(obj2, 453, 0.5432 "any text");
, а
C++
1
2
a obj1("ёклмн");
a obj2(obj1, "ёпрст");
не должно. Как сделать?
vladimir bragin
1 / 1 / 0
Регистрация: 25.02.2010
Сообщений: 3
28.02.2010, 20:20     Запреты #6
Пардон, в моём коде две ошибки:
вместо
C++
1
_className = new char[strlen(name)];
надо
C++
1
_className = new char[strlen(name) + 1];
и вместо
C++
1
delete _className;
надо
C++
1
delete [] _className;
и также поправки к комментариям:
C++
1
2
3
4
5
6
    /* Следующие код не компилируется, как и ожидается.
    a obj2("Some object");
    a *pobj2=new a("Another object");
    a *pobj4;
    pobj4=new a("Addition another object");
    */
В остальном, Тарас, я твой вопрос относительно последних замечаний не понимаю, так как в одном случае ты допускаешь компиляцию
C++
1
a obj1("ёклмн");
и тут же далее нет.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
01.03.2010, 06:03  [ТС]     Запреты #7
Вторая строка компилиться не должна.
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
01.03.2010, 14:42     Запреты #8
taras atavin, почитай Мейерс. 35 советов. правило 27
Yandex
Объявления
01.03.2010, 14:42     Запреты
Ответ Создать тему
Опции темы

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