C++, бросающий программно: это может быть сделано?

Не проверено, поскольку вы не предоставили ни одного примера ввода / вывода для тестирования, но это может быть то, что вы ищете:

sed -i 's/\(select dbms_metadata.get_ddl('\''PACKAGE'\'',\).*/\1'"${var}"','\''PRC_BNE_JZ'\'') from dual;/' backup_script.sql

Не используйте | в качестве разделителя, так как метасимвол ERE и так делает ваш код в лучшем случае запутанным для чтения и может вызвать проблемы, если / когда вы решите использовать ERE позже (через -E arg).

Всегда используйте одинарные кавычки вокруг сценариев и строк, если у вас нет очень конкретной причины, почему вы не должны этого делать, и полностью понимаете все последствия.

5
задан John Topley 28 October 2008 в 12:37
поделиться

8 ответов

Не делать.

Читайте на полиморфизме. Почти каждый "динамический бросок" ситуация является примером полиморфизма, изо всех сил пытающегося быть реализованным.

Независимо от того, что решение, которое Вы делаете в динамическом броске, было уже принято. Просто делегируйте реальную работу к подклассам.

Вы не учли самую важную часть своего примера. Полезная, полиморфная работа.

string typename = typeid(*object).name();
if(typename == "Derived1") {
   Derived1 *d1 = static_cast< Derived1*>(object);
   d1->doSomethingUseful();
}
else if(typename == "Derived2") {
   Derived2 *d2 = static_cast < Derived2*>(object);
   d2->doSomethingUseful();
}
...
else {
  ...
}

Если каждый подкласс реализует doSomethingUseful, это все намного более просто. И полиморфный.

object->doSomethingUseful();
22
ответ дан 18 December 2019 в 05:15
поделиться

Можно использовать dynamic_cast и тест для ПУСТОГО УКАЗАТЕЛЯ, но я сильно рассмотрел бы рефакторинг кода вместо этого.

При необходимости в определенной для подкласса обработке Шаблонный Метод мог бы быть полезным, но не зная, что Вы пробуете к achive, это - только неопределенное предположение.

9
ответ дан 18 December 2019 в 05:15
поделиться
Derived1* d1 = dynamic_cast< Derived1* >(object);
if (d1 == NULL)
{
    Derived2* d2 = dynamic_cast< Derived2* >(object);
    //etc
}

У меня есть следующие методы на моем типе smartpointer, моделирование C# и 'как':

template< class Y > bool is() const throw()
    {return !null() && dynamic_cast< Y* >(ptr) != NULL;}
template< class Y > Y* as() const throw()
    {return null() ? NULL : dynamic_cast< Y* >(ptr);}
5
ответ дан 18 December 2019 в 05:15
поделиться

Можно сделать это использование dynamic_cast, например:

if ( Derived1* d1 = dynamic_cast<Derived1*>(object) ) {
    // object points to a Derived1
    d1->foo();
}
else if ( Derived2* d2 = dynamic_cast<Derived2*>(object) ) {
    // object points to a Derived2
    d2->bar();
}
else {
    // etc.
}

Но поскольку другие сказали, код, такой как это может указать на плохой дизайн, и необходимо обычно использовать виртуальные функции для реализации полиморфного поведения.

4
ответ дан 18 December 2019 в 05:15
поделиться

обычно, это - знак плохого дизайна. Почему необходимо сделать это? Могло бы быть возможно перепроектировать так, чтобы это было не нужно.

3
ответ дан 18 December 2019 в 05:15
поделиться

Ваш пример не портирует, потому что точный формат имени () не указан. Вы могли попробовать последовательность dynamic_casts. Dynamic_cast возвращает нулевого указателя, если Вы бросаете к неправильному типу. Однако при выполнении typeswitch как этот существует что-то не так с дизайном.

1
ответ дан 18 December 2019 в 05:15
поделиться

Что Вы пытаетесь выполнить, точно? По моему опыту, вещами как это является знак плохого дизайна. Переоцените свою иерархию классов, потому что цель объектно-ориентированного проектирования, делают вещи как это ненужными.

2
ответ дан 18 December 2019 в 05:15
поделиться

Я думаю, что dynamic_cast является способом пойти, но я особенно не думаю, что это - плохой дизайн для всех возможных условий, потому что объект быть литым может быть чем-то обеспеченным некоторым сторонним модулем. Скажем, объект был создан плагином, о котором не знает автор приложения. И что конкретный плагин может создать Derived1 (являющийся старой версией) текстовый объект или Derived2 (являющийся новой версией) текстовый объект. Возможно, сменный интерфейс не был разработан, чтобы сделать версию определенный материал, это просто создает объект, таким образом, приложение должно сделать этот вид проверки для обеспечения надлежащего кастинга/выполнения. После этого мы можем безопасно назвать объект doSomethingUsefulThatDoesNotExistInDerived1 ();

1
ответ дан 18 December 2019 в 05:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: