Можно ли создать класс, создавать только динамически?
От: Haiodo Россия  
Дата: 15.10.02 04:41
Оценка:
Скажите Please! можно ли создать класс только с динимическим созданием.

Например.


class Test {
        //...
};
int test( ) {
        Test t; // Должен выдавать ошибку компиляции.
        Test* pt = new Test( ); // Должна нормально работать.
        //...
}


Но проблемма нельзя использовать friends и static методы.

Заранее благодарен.
Re: Можно ли создать класс, создавать только динамически?
От: Vasiliy_Krasnokutsky Россия  
Дата: 15.10.02 04:48
Оценка:
Здравствуйте Haiodo,

Вряд ли такое возможно ... Только если ты сам будешь всегда делать динамический вызов.
А насчет friend и static это ты зря. Их можно использовать везде, по мере необходимости.
Re: Можно ли создать класс, создавать только динамически?
От: Dr_Sh0ck Беларусь  
Дата: 15.10.02 04:55
Оценка: 17 (2)
Здравствуйте Haiodo, Вы писали:

H>Скажите Please! можно ли создать класс только с динимическим созданием.


Попробуй так
class A
{
    int i;
    
    ~A(){} //деструктор "закрыт"
public:
    A() {}
    void Dispose() { delete this; }
};

int main(int argc, char* argv[])
{
    A *a = new A();

    

//    A a2; //будет ошибка

    a->Dispose();

    return 0;
}
Do not fake yourself ;)
ICQ#: 198114726
Re: Можно ли создать класс, создавать только динамически?
От: ivan_k Россия  
Дата: 15.10.02 05:08
Оценка:
Здравствуйте Haiodo, Вы писали:

H>Скажите Please! можно ли создать класс только с динимическим созданием.


H>Например.


H>

H>
H>class Test {
H>        //...
H>};
H>int test( ) {
H>        Test t; // Должен выдавать ошибку компиляции.
H>        Test* pt = new Test( ); // Должна нормально работать.
H>        //...
H>}
H>


H>Но проблемма нельзя использовать friends и static методы.


H>Заранее благодарен.


Очень подробно рассказано у Мейерса в его 85 советах по улучшению программ на С++ или у Элджера в черной книге по извращениям. Если правильно помню, задача в общем виде не имеет решения — либо от класса нельзя наследовать, или еще что-то вылезает
Re[2]: Можно ли создать класс, создавать только динамически?
От: Haiodo Россия  
Дата: 15.10.02 05:21
Оценка:
Здравствуйте ivan_k, Вы писали:

IK>Очень подробно рассказано у Мейерса в его 85 советах по улучшению программ на С++ или у Элджера в черной книге по извращениям. Если правильно помню, задача в общем виде не имеет решения — либо от класса нельзя наследовать, или еще что-то вылезает


А нельзя ли поподробнее о второй книжке.
Заранее благодарен.
Re[3]: Можно ли создать класс, создавать только динамически?
От: ivan_k Россия  
Дата: 15.10.02 05:41
Оценка:
Здравствуйте Haiodo, Вы писали:

H>Здравствуйте ivan_k, Вы писали:


IK>>Очень подробно рассказано у Мейерса в его 85 советах по улучшению программ на С++ или у Элджера в черной книге по извращениям. Если правильно помню, задача в общем виде не имеет решения — либо от класса нельзя наследовать, или еще что-то вылезает


H>А нельзя ли поподробнее о второй книжке.

H>Заранее благодарен.

Тут на сайте очень хорошая подборка ресурсов: Ресурсы/Книги/С++/С++: Библиотека программиста — это и есть более подробное описание книжки. Лично мне книга показалась тяжеловатой 1) из-за нетрадиционной терминологии 2) решения уже решенных (сейчас, но, очевидно, не на момент написания) проблем. Мейерс там же описан, по мне — он попроще и более "совместимый" с другой литературой, особенно со Страуструпом.
Re: Можно ли создать класс, создавать только динамически?
От: Lloyd Россия  
Дата: 15.10.02 05:50
Оценка:
Здравствуйте Haiodo, Вы писали:

H>Скажите Please! можно ли создать класс только с динимическим созданием.


H>Например.


H>

H>
H>class Test {
H>        //...
H>};
H>int test( ) {
H>        Test t; // Должен выдавать ошибку компиляции.
H>        Test* pt = new Test( ); // Должна нормально работать.
H>        //...
H>}
H>


H>Но проблемма нельзя использовать friends и static методы.


H>Заранее благодарен.


Спрашиваю как человек далекий от C++. А зачем?
Re[2]: Можно ли создать класс, создавать только динамически?
От: Коренчук Иван Россия  
Дата: 15.10.02 06:12
Оценка: 7 (2)
Здравствуйте Lloyd, Вы писали:

L>Здравствуйте Haiodo, Вы писали:


H>>Скажите Please! можно ли создать класс только с динимическим созданием.


H>>Например.


H>>

H>>
H>>class Test {
H>>        //...
H>>};
H>>int test( ) {
H>>        Test t; // Должен выдавать ошибку компиляции.
H>>        Test* pt = new Test( ); // Должна нормально работать.
H>>        //...
H>>}
H>>


H>>Но проблемма нельзя использовать friends и static методы.


H>>Заранее благодарен.


L>Спрашиваю как человек далекий от C++. А зачем?


Как человек, знакомый с Явой, отвечаю: там это не сильно нужно, а в С++ можно положиться на автоудаление стековых переменных при выходе из области видимости (при завершении блока нормальным образом или по exception с включенной раскруткой стека). Зачем полагаться на автоудаление — для освобождения ресурсов (в Яве я так и не научился делать это со 100% уверенностью в надежности своего кода) — смотри шаблок auto_ptr (авторабота с кучей) и ему подобные.
Внимание, ответ. Если разрабатывается библиотека, которую будут пользовать чайники (т.е. любой программист, кроме автора), требуется запретить им делать бессмысленные вещи, например, размещать структуры типа auto_ptr в куче, так как там они не решают задач, для которых создавались (ограждение пользователя от этой кучи). Еще один пример — блокировка. Очень плохо, когда она почему-то не удаляется. Еще — соединение с БД — обидно, когда сервер понемногу съедает лимит.
Re[3]: Можно ли создать класс, создавать только динамически?
От: Кодт Россия  
Дата: 15.10.02 12:03
Оценка:
Здравствуйте Коренчук Иван, Вы писали:

L>>Спрашиваю как человек далекий от C++. А зачем?


КИ>Как человек, знакомый с Явой, отвечаю: там это не сильно нужно, а в С++ можно положиться на автоудаление стековых переменных при выходе из области видимости (при завершении блока нормальным образом или по exception с включенной раскруткой стека). Зачем полагаться на автоудаление — для освобождения ресурсов (в Яве я так и не научился делать это со 100% уверенностью в надежности своего кода) — смотри шаблок auto_ptr (авторабота с кучей) и ему подобные.

КИ>Внимание, ответ. Если разрабатывается библиотека, которую будут пользовать чайники (т.е. любой программист, кроме автора), требуется запретить им делать бессмысленные вещи, например, размещать структуры типа auto_ptr в куче, так как там они не решают задач, для которых создавались (ограждение пользователя от этой кучи). Еще один пример — блокировка. Очень плохо, когда она почему-то не удаляется. Еще — соединение с БД — обидно, когда сервер понемногу съедает лимит.

Какое-то перепутывание...

Автоматические (automatic) — на стеке — экземпляры — это достоинство, а не недостаток C++! Тем самым гарантируется сборка этого рода мусора. Причем известно время этой уборки.
auto_ptr и другие умные указатели только облегчают жизнь.
А вот использование голых, необернутых указателей — и есть источник ошибок.

В яве ты полагаешься на сборщика мусора... А какая у него стратегия? При желании можно любого сборщика замордовать. На то уж пошло, в яве все указатели — "умные" (только они не гробят объекты, а взаимодействуют со сборщиком).
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.