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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 5.00
hepr
61 / 33 / 5
Регистрация: 21.10.2010
Сообщений: 539
#1

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

21.07.2012, 23:46. Просмотров 2290. Ответов 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, который ничего не возвращает, на что компилятор начал ругаться.
Больше идей к сожалению не пришло.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2012, 23:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Существование объекта (C++):

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
22.07.2012, 00:02 #2
Я что-то среднее между Биллом Гейтсом и маккакой)
нет, ты - гораздо ниже их обоих (а они - где-то рядом)
или объясни, зачем такое может понадобиться. тогда я, возможно, соглашусь на место где-то рядом с этой бездарью гэйтсом
hepr
61 / 33 / 5
Регистрация: 21.10.2010
Сообщений: 539
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
1483 / 1059 / 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
61 / 33 / 5
Регистрация: 21.10.2010
Сообщений: 539
22.07.2012, 10:34  [ТС] #5
Большое спасибо, буду пробовать!
Nick Alte
Эксперт С++
1636 / 1008 / 119
Регистрация: 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);  // Так нельзя
}
hepr
61 / 33 / 5
Регистрация: 21.10.2010
Сообщений: 539
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
Эксперт С++
1636 / 1008 / 119
Регистрация: 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();
}
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
22.07.2012, 23:36 #9
так и не понял я, какая задача собственно стоит.
hepr
61 / 33 / 5
Регистрация: 21.10.2010
Сообщений: 539
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
Эксперт С++
1636 / 1008 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
24.07.2012, 11:55 #11
Так что может быть проще и безопаснее, чем функция? Реализация потока в виде класса представляется мне излишней, поскольку вся роль объекта сводится к выполнению действий сначала при создании объекта, а потом при его уничтожении. Обращений к объекту нет, значит, интерфейса у него тоже нет. Значит, и смысла в отдельном классе нет. Достаточно вынести нужные действия в функцию и запускать её отдельным потоком.
hepr
61 / 33 / 5
Регистрация: 21.10.2010
Сообщений: 539
24.07.2012, 15:45  [ТС] #12
Цитата Сообщение от Nick Alte Посмотреть сообщение
Так что может быть проще и безопаснее, чем функция? Реализация потока в виде класса представляется мне излишней, поскольку вся роль объекта сводится к выполнению действий сначала при создании объекта, а потом при его уничтожении. Обращений к объекту нет, значит, интерфейса у него тоже нет. Значит, и смысла в отдельном классе нет. Достаточно вынести нужные действия в функцию и запускать её отдельным потоком.
К чему в итоге мы и пришли))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.07.2012, 15:45
Привет! Вот еще темы с ответами:

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

Проверка на существование папки - C++
if (localadress) cout<<"Существует"; else cout<<"Надо создать"; if ("D:\\Games") cout<<"Существует"; else cout<<"Надо создать"; ...

Как добавить проверку на существование - C++
Необходимо добавить проверку на существование треугольника. Что то вроде этого: double A=sqrt((y2-y1)*(y2-y1)+(x2-x1)*(x2-x1));...

Как проверить существование файла в С++? - C++
Облазил пол гугла, что за привычка писать часть кода, не показывая инклуды... Нарыл, добавил: #include <cstring> #include...


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

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

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