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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 5.00
hepr
 Аватар для hepr
60 / 32 / 5
Регистрация: 21.10.2010
Сообщений: 538
21.07.2012, 23:46     Существование объекта #1
Здравствуйте, есть довольно сложное и интересное задание
Есть класс 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, который ничего не возвращает, на что компилятор начал ругаться.
Больше идей к сожалению не пришло.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2012, 23:46     Существование объекта
Посмотрите здесь:

Как правильно вызывать функцию объекта из другой функции того же объекта? C++
C++ Требуется ли при удалении объекта посредством delete указывать тип объекта?
При возврате объекта из функции пишет, что для объекта не определен констуктор копирования C++
Создание объекта в функции и возврат объекта из нее C++
Функция проверяющая существование треугольника C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
22.07.2012, 00:02     Существование объекта #2
Я что-то среднее между Биллом Гейтсом и маккакой)
нет, ты - гораздо ниже их обоих (а они - где-то рядом)
или объясни, зачем такое может понадобиться. тогда я, возможно, соглашусь на место где-то рядом с этой бездарью гэйтсом
hepr
 Аватар для hepr
60 / 32 / 5
Регистрация: 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); // как только переменная выходит из области видимости она удаляется, не завершив свою работу
DU
1477 / 1053 / 45
Регистрация: 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;
}
hepr
 Аватар для hepr
60 / 32 / 5
Регистрация: 21.10.2010
Сообщений: 538
22.07.2012, 10:34  [ТС]     Существование объекта #5
Большое спасибо, буду пробовать!
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 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);  // Так нельзя
}
hepr
 Аватар для hepr
60 / 32 / 5
Регистрация: 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);
Но все равное большое спасибо, я и не знал что в производных классах можно избавляться от полей базового))
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 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();
}
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
22.07.2012, 23:36     Существование объекта #9
так и не понял я, какая задача собственно стоит.
hepr
 Аватар для hepr
60 / 32 / 5
Регистрация: 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();
}
так и не понял я, какая задача собственно стоит.
Просто отдельный поток реализует сам класс, он же и является некоторой автономией которую надо лишь(!) запустить(поэтому и надо было запретить использование объектов этого класса), а что делать дальше он разберется сам, и надо было сделать его наиболее безопасное использование.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
24.07.2012, 11:55     Существование объекта #11
Так что может быть проще и безопаснее, чем функция? Реализация потока в виде класса представляется мне излишней, поскольку вся роль объекта сводится к выполнению действий сначала при создании объекта, а потом при его уничтожении. Обращений к объекту нет, значит, интерфейса у него тоже нет. Значит, и смысла в отдельном классе нет. Достаточно вынести нужные действия в функцию и запускать её отдельным потоком.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.07.2012, 15:45     Существование объекта
Еще ссылки по теме:

Указать на существование функции C++
C++ Как проверить существование файла?
C++ Проверка на существование папки

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

Или воспользуйтесь поиском по форуму:
hepr
 Аватар для hepr
60 / 32 / 5
Регистрация: 21.10.2010
Сообщений: 538
24.07.2012, 15:45  [ТС]     Существование объекта #12
Цитата Сообщение от Nick Alte Посмотреть сообщение
Так что может быть проще и безопаснее, чем функция? Реализация потока в виде класса представляется мне излишней, поскольку вся роль объекта сводится к выполнению действий сначала при создании объекта, а потом при его уничтожении. Обращений к объекту нет, значит, интерфейса у него тоже нет. Значит, и смысла в отдельном классе нет. Достаточно вынести нужные действия в функцию и запускать её отдельным потоком.
К чему в итоге мы и пришли))
Yandex
Объявления
24.07.2012, 15:45     Существование объекта
Ответ Создать тему
Опции темы

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