Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/16: Рейтинг темы: голосов - 16, средняя оценка - 4.50
hepr
61 / 33 / 13
Регистрация: 21.10.2010
Сообщений: 538
1

Существование объекта

21.07.2012, 23:46. Просмотров 3052. Ответов 11
Метки нет (Все метки)

Здравствуйте, есть довольно сложное и интересное задание
Есть класс someClass
нужно сделать так чтобы:
1) Его объекты можно было создавать только динамически
2) Даже созданные динамически объекты хранить нигде нельзя(не допускаются указатели на память, объект сам удаляется)
То есть можно так:
C++ (Qt)
1
new someClass();
но не так:
C++ (Qt)
1
2
someClass *sc = new someClass();
someClass sc;
1 как реализовать и можно ли вообще это сделать не знаю, насчет 2 пункта пытался:
переопределить оператор =, чтобы когда он принимает указатель выдавало ошибку, но не получилось так как когда я пишу someClass *sc = new someClass();, срабатывает оператор присваивания у указателя, а не у самого класса.
Далее попытался сделать свой оператор new, который ничего не возвращает, на что компилятор начал ругаться.
Больше идей к сожалению не пришло.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2012, 23:46
Ответы с готовыми решениями:

Требуется ли при удалении объекта посредством delete указывать тип объекта?
например, есть указателиvoid *p1; void *p2; есть VCL-объект TButton, есть...

Как правильно вызывать функцию объекта из другой функции того же объекта?
Доброго дня и ночи, уважаемые программисты! Существует некоторая проблема, на...

Свойство объекта в виде массива char заполняется только для одного объекта
Есть два свойства: одно - string, второе - массив char. Если начать заполнять...

При возврате объекта из функции пишет, что для объекта не определен констуктор копирования
Пишу шаблонный класс матриц. Делаю, значит, переопределение оператора + для...

Создание объекта в функции и возврат объекта из нее
Не могу разобраться с ссылками. Возможно ли вернуть из функции объект созданный...

11
novi4ok
551 / 504 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
22.07.2012, 00:02 2
Я что-то среднее между Биллом Гейтсом и маккакой)
нет, ты - гораздо ниже их обоих (а они - где-то рядом)
или объясни, зачем такое может понадобиться. тогда я, возможно, соглашусь на место где-то рядом с этой бездарью гэйтсом
0
hepr
61 / 33 / 13
Регистрация: 21.10.2010
Сообщений: 538
22.07.2012, 00:59  [ТС] 3
В проекте понадобился класс, реализующий распределение иконки, в зависимости от некоторых параметров для разных элементов, и так как класс приходиться использовать часто хотелось бы сделать работу с ним максимально удобной(в плане меньше кода).
Использование примерно такое:
new RIconManager(item);
Класс работает полностью асинхронно от кода в котором он объявлен, для того чтобы программа не дожидалась пока класс завершит свою работу.
Соответственно при завершении своей работы он сам удаляется.
Это все порождает ограничения, которые я хочу наложить, так как возможны такие случаи:
C++ (Qt)
1
2
3
RIconManager *im = new RIconManager(item);
//класс отработал и удалился
im->someFunction(); //ошибка
Или
C++ (Qt)
1
RIconManager(item); // как только переменная выходит из области видимости она удаляется, не завершив свою работу
0
DU
1487 / 1133 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
22.07.2012, 01:39 4
делаете все конструкторы класса приватными.
делаете в классе одну публичную статическую функцию-фабрику, которая и будет создавать инстанс класса и ничего не возвращать. в ней же можно вставить проверки, чтобы инстанс был один. такая вот смесь синглтона с хз чем еще.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class MyClass
{
private:
  MyClass()
  {
  }
 
public:
  static void CreateMyClass()
  {
     new MyClass();
  }
};
 
int main()
{
   MyClass::CreateMyClass();
 
   return 0;
}
1
hepr
61 / 33 / 13
Регистрация: 21.10.2010
Сообщений: 538
22.07.2012, 10:34  [ТС] 5
Большое спасибо, буду пробовать!
0
Nick Alte
Эксперт С++
1647 / 1019 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
22.07.2012, 10:42 6
А зачем нужен new тогда? Лучше как раз запретить operator new в самом классе (объявить в секции private без реализации или через =delete, если компилятор умеет), что позволит создавать только автоматические объекты, которые будут сами по себе уничтожаться.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Automatic {
public:
    explicit Automatic(int item);
    ~Automatic();
    void* operator new(size_t) = delete;
    Automatic(const Automatic&) = delete;   // Запретим копирование
    Automatic& operator = (const Automatic&) = delete;  // ... и присваивание
};
 
void foo(const Automatic& a)
{
}
 
int main()
{
    Automatic a(1);  // Будет уничтожено после выхода из main
    foo(a);
    foo(Automatic(2));  // Безымянный экземпляр будет уничтожен после возврата из foo
    Automatic *pa = &a;  // Допустимо, но лучше так не делать
    pa = new Automatic(3);  // Так нельзя
}
1
hepr
61 / 33 / 13
Регистрация: 21.10.2010
Сообщений: 538
22.07.2012, 11:22  [ТС] 7
Все вариант, предложенный DU более предпочтительный, так как от этого:
C++
1
2
3
4
Automatic a(1);  // Будет уничтожено после выхода из main
    foo(a);
    foo(Automatic(2));  // Безымянный экземпляр будет уничтожен после возврата из foo
    Automatic *pa = &a;
Я и хотел максимально избавиться, оставив только это new Authomatic(item);
Но все равное большое спасибо, я и не знал что в производных классах можно избавляться от полей базового))
0
Nick Alte
Эксперт С++
1647 / 1019 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
22.07.2012, 13:28 8
Да, не разглядел вопроса. Если надо полностью асинхронно, по системе "fire and forget", возникает другой вопрос - а зачем там тогда вообще объект? Тут задача больше походит на ситуацию "автономная функция в своём потоке", что-то вроде такого:
C++
1
2
3
4
5
6
7
void ManageIcon(int item);
 
void foo()
{
    const int iconStandard = 1;
    std::thread(ManageIcon, iconStandard).detach();
}
1
novi4ok
551 / 504 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
22.07.2012, 23:36 9
так и не понял я, какая задача собственно стоит.
0
hepr
61 / 33 / 13
Регистрация: 21.10.2010
Сообщений: 538
24.07.2012, 10:28  [ТС] 10
Цитата Сообщение от Nick Alte Посмотреть сообщение
Да, не разглядел вопроса. Если надо полностью асинхронно, по системе "fire and forget", возникает другой вопрос - а зачем там тогда вообще объект? Тут задача больше походит на ситуацию "автономная функция в своём потоке", что-то вроде такого:
C++
1
2
3
4
5
6
7
void ManageIcon(int item);
 
void foo()
{
    const int iconStandard = 1;
    std::thread(ManageIcon, iconStandard).detach();
}
так и не понял я, какая задача собственно стоит.
Просто отдельный поток реализует сам класс, он же и является некоторой автономией которую надо лишь(!) запустить(поэтому и надо было запретить использование объектов этого класса), а что делать дальше он разберется сам, и надо было сделать его наиболее безопасное использование.
0
Nick Alte
Эксперт С++
1647 / 1019 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
24.07.2012, 11:55 11
Так что может быть проще и безопаснее, чем функция? Реализация потока в виде класса представляется мне излишней, поскольку вся роль объекта сводится к выполнению действий сначала при создании объекта, а потом при его уничтожении. Обращений к объекту нет, значит, интерфейса у него тоже нет. Значит, и смысла в отдельном классе нет. Достаточно вынести нужные действия в функцию и запускать её отдельным потоком.
0
hepr
61 / 33 / 13
Регистрация: 21.10.2010
Сообщений: 538
24.07.2012, 15:45  [ТС] 12
Цитата Сообщение от Nick Alte Посмотреть сообщение
Так что может быть проще и безопаснее, чем функция? Реализация потока в виде класса представляется мне излишней, поскольку вся роль объекта сводится к выполнению действий сначала при создании объекта, а потом при его уничтожении. Обращений к объекту нет, значит, интерфейса у него тоже нет. Значит, и смысла в отдельном классе нет. Достаточно вынести нужные действия в функцию и запускать её отдельным потоком.
К чему в итоге мы и пришли))
0
24.07.2012, 15:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.07.2012, 15:45

Вывод данных вложенного объекта из другого объекта
Добрый День! Хочу в одном объекте вывести текст который находится во вложенном...

Существование указателя
Есть линейный список(создаю эл-ты пока вручную). Если в последнем эл-те не...

Указать на существование функции
То что с++ не видит ничего ниже себя создает много проблем. У меня много...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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