Re[7]: Изменение прототипа вирт ф-ции в базовом классе
От: Bell Россия  
Дата: 09.12.05 14:10
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Дак даже VC 6.0 скажет


L_L>

L_L>D:\test\main.cpp(13) : error C2838: illegal qualified name in member declaration


А вот VC7.1 даже не поперхнулся
Любите книгу — источник знаний (с) М.Горький
Re[8]: Изменение прототипа вирт ф-ции в базовом классе
От: Chez Россия  
Дата: 09.12.05 14:20
Оценка:
Здравствуйте, Bell, Вы писали:

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


L_L>>Дак даже VC 6.0 скажет


L_L>>

L_L>>D:\test\main.cpp(13) : error C2838: illegal qualified name in member declaration


B>А вот VC7.1 даже не поперхнулся

Н-да. Приношу извинения за туфту.
Я в VC и смотрел и благодаря ему, любимому, уже давно считал что это абсолютно валидный код.


Попутно хотелось бы спросить, такой код:
class C
{
    typedef int pfn(int, int);
    pfn z;
};

int C::z(int, int)
{
    return 0;
}

Это тоже только для VC нормально? Или стандарт?

Chez, ICQ#161095094

Posted via:RSDN@Home;version:1.1.3;muzikstamp:silent

Re[9]: Изменение прототипа вирт ф-ции в базовом классе
От: Lorenzo_LAMAS  
Дата: 09.12.05 14:23
Оценка: 1 (1)
C>Это тоже только для VC нормально? Или стандарт?

Второе
Of course, the code must be complete enough to compile and link.
Re[9]: Изменение прототипа вирт ф-ции в базовом классе
От: Bell Россия  
Дата: 09.12.05 14:26
Оценка: 1 (1)
Здравствуйте, Chez, Вы писали:

C>Это тоже только для VC нормально? Или стандарт?

Да, тут все в порядке — смотри 9.3/9.
Любите книгу — источник знаний (с) М.Горький
Re[10]: Изменение прототипа вирт ф-ции в базовом классе
От: Chez Россия  
Дата: 09.12.05 14:28
Оценка: :))
Здравствуйте, Lorenzo_LAMAS, Вы писали:


C>>Это тоже только для VC нормально? Или стандарт?


L_L>Второе

это радует

Chez, ICQ#161095094

Posted via:RSDN@Home;version:1.1.3;muzikstamp:silent

Re[6]: Изменение прототипа вирт ф-ции в базовом классе
От: sergey_shandar США http://getboost.codeplex.com/
Дата: 09.12.05 14:28
Оценка:
Здравствуйте, Bell, Вы писали:

_W>>Господа, не выключайте варнинги своего компилятора!

B>Мне кажется, тут нужно немного перефразировать: "Господа, включайте все варнинги своего компилятора, которые отключены по умолчанию!" Ибо в VC7.1 C4263 и C4264 off by default
B>
Варнингы включены всегда и все. Только если функцию переименовать, никаких варнингов все равно не будет. В варианте remark и в моем, конечно будет ошибка компиляции. Т.е., гораздо ближе к тому что действительно называется override.
getboost.codeplex.com
citylizard.codeplex.com
Re[11]: Изменение прототипа вирт ф-ции в базовом классе
От: Lorenzo_LAMAS  
Дата: 09.12.05 14:30
Оценка: :)
L_L>>Второе
C>это радует

Опять какая-нить черная магия?
Of course, the code must be complete enough to compile and link.
Re[7]: Изменение прототипа вирт ф-ции в базовом классе
От: Bell Россия  
Дата: 09.12.05 14:32
Оценка:
Здравствуйте, sergey_shandar, Вы писали:

_>Варнингы включены всегда и все.


А в справку заглянуть для начала?
Любите книгу — источник знаний (с) М.Горький
Re: Изменение прототипа вирт ф-ции в базовом классе
От: andrij Украина  
Дата: 09.12.05 14:40
Оценка:
On Thu, 08 Dec 2005 14:36:17 +0200, wrote:

> Наступил давеча на такие грабли. В базовом классе объявлена вирт. ф-ция, которая понятно переопределяется в наследуемых классах. Схема наследования такая:

>
>
>
>
> class Base { virtual foo() = 0; }
> class Derived : public Base { virtual foo() {}; }
> class Derived1, Derived2, ..., DerivedN : public Derived ;
>
>

>
> Основная масса классов пользуется ф-цией, определенной в Derived, но в некоторых из DerivedX требуется переопределять ф-цию foo() специфичным образом. В один прекрасный момент понадобилось изменить прототип ф-ции foo() в классе Base, что и было успешно сделано. Прототип в Derived тоже был изменен ( забыть об этом было нельзя, т.к. foo() в Base чисто виртуальная), а вот про некоторые из классов DerivedX благополучно было забыто (т.к.их достаточно много). Вопрос в том, как писать безопасный код, гарантированно исключающий такие ситуации?

ето плохо, когда спроектированый интерфейс приходитса менять.
мне намисль приходит только одно решение:

  class Base { public: virtual foo() = 0; }

  class Derived : public Base { protected: __foo() {}; }

  class Derived1, Derived2, ..., DerivedN : public Derived
  {
    public: virtual foo(){Derived::__foo()}
  }


тогда у тебя выдет што виртуальная ф-ция переопределена в каждом класе, и компилер плюнетса всюду, но придетса немножко пописать

другой вариант — ето поиск по имени ф-ции по всем заголовочным файлам
Posted via RSDN NNTP Server 1.9
make it simple as possible, but not simpler
Re[10]: Изменение прототипа вирт ф-ции в базовом классе
От: Chez Россия  
Дата: 09.12.05 14:40
Оценка:
Здравствуйте, Bell, Вы писали:

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


C>>Это тоже только для VC нормально? Или стандарт?

B>Да, тут все в порядке — смотри 9.3/9.
B>
Хи, там написано:

[Note: a member function can be declared (but not defined) using a typedef for a function type. The resulting
member function has exactly the same type as it would have if the function declarator were provided
explicitly, see 8.3.5. For example,

typedef void fv(void);
typedef void fvc(void) const;
struct S {
fv memfunc1; // equivalent to: void memfunc1(void);
void memfunc2();
fvc memfunc3; // equivalent to: void memfunc3(void) const;
};
fv S::* pmfv1 = &S::memfunc1;
fv S::* pmfv2 = &S::memfunc2;
fvc S::* pmfv3 = &S::memfunc3;
Also see 14.3. ]


А вот VC без проблем глотакт даже такой код:
class C
{
public:
    typedef int pfn(int x, int y);
    
    pfn z
    {
        return x + y;
    }
};


Т.е. всё таки VC — опять наворотил своего?

Chez, ICQ#161095094

Posted via:RSDN@Home;version:1.1.3;muzikstamp:silent

Re[11]: Изменение прототипа вирт ф-ции в базовом классе
От: Bell Россия  
Дата: 09.12.05 14:46
Оценка:
Здравствуйте, Chez, Вы писали:
C>Хи, там написано:
... Ну так в твоем примере речь шла только о декларации


C>Т.е. всё таки VC — опять наворотил своего?

Насчет возможности определения — да.
Любите книгу — источник знаний (с) М.Горький
Re[12]: Изменение прототипа вирт ф-ции в базовом классе
От: Chez Россия  
Дата: 09.12.05 14:47
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>>>Второе

C>>это радует

L_L>Опять какая-нить черная магия?

Да. Я недавно писал про то что хочу сделать Проект "Рефлексия C++"
Автор: Chez
Дата: 05.12.05
, но в последнее время склоняюсь к тому, чтобы сделать либу. В ней я хотел заюзать такой синтаксис:
#define virtual(result_t, name) \
    virtual name##_t name; \
    typedef result_t name##_t
    
class Test
{
    virtual(int, foo)(int x, int y);
};

Т.е. всё это лишь для того, чтобы список параметров не нужно было вносить в аргументы макроса
(Внутри virtual() будет ещё много другого).

Chez, ICQ#161095094

Posted via:RSDN@Home;version:1.1.3;muzikstamp:silent

Re[12]: Изменение прототипа вирт ф-ции в базовом классе
От: Chez Россия  
Дата: 09.12.05 14:53
Оценка:
Здравствуйте, Bell, Вы писали:

B>... Ну так в твоем примере речь шла только о декларации

B>Насчет возможности определения — да.
А рвзве выделенное жирным:
class C
{
    typedef int pfn(int, int);
    pfn z;
};

int C::z(int, int)
{
    return 0;
}

Это не определение?
Меня смущает что в примере показано определение только через присваивание.

Chez, ICQ#161095094

Posted via:RSDN@Home;version:1.1.3;muzikstamp:silent

Re[13]: Изменение прототипа вирт ф-ции в базовом классе
От: Lorenzo_LAMAS  
Дата: 09.12.05 14:54
Оценка:
C>Т.е. всё это лишь для того, чтобы список параметров не нужно было вносить в аргументы макроса
C>(Внутри virtual() будет ещё много другого).

Но даже приведенного хватает, чтоб не компилилось
Of course, the code must be complete enough to compile and link.
Re[13]: Изменение прототипа вирт ф-ции в базовом классе
От: Bell Россия  
Дата: 09.12.05 14:56
Оценка:
Здравствуйте, Chez, Вы писали:

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


B>>... Ну так в твоем примере речь шла только о декларации

B>>Насчет возможности определения — да.
C>А рвзве выделенное жирным:
C>
C>class C
C>{
C>    typedef int pfn(int, int);
C>    pfn z;
C>};

C>int C::z(int, int)
C>{
C>    return 0;
C>}
C>

C>Это не определение?

Определение, только в стандарте имеется ввиду определение в теле класса.

C>Меня смущает что в примере показано определение только через присваивание.
Любите книгу — источник знаний (с) М.Горький
Re[14]: Изменение прототипа вирт ф-ции в базовом классе
От: Lorenzo_LAMAS  
Дата: 09.12.05 14:58
Оценка: +1
B>Определение, только в стандарте имеется ввиду определение в теле класса.

В стандарте имеется в виду, что тайпдеф, задающий тип функции, не может использоваться в определении, а может только в объявлении.
Of course, the code must be complete enough to compile and link.
Re[8]: Изменение прототипа вирт ф-ции в базовом классе
От: sergey_shandar США http://getboost.codeplex.com/
Дата: 09.12.05 15:13
Оценка:
Здравствуйте, Bell, Вы писали:

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


_>>Варнингы включены всегда и все.


B>А в справку заглянуть для начала?


Для начала, лучше узнать кто пустил дезу — что я не включаю варнинги, а потом посылать в MSDN, не буду показывать пальцем .

Дело в том что эти варнинги не решают полностью проблему! Если я пропустил букву в имени функции (что случается) — мне никакой варнинг не поможет.
getboost.codeplex.com
citylizard.codeplex.com
Re[15]: Изменение прототипа вирт ф-ции в базовом классе
От: srggal Украина  
Дата: 09.12.05 15:13
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

B>>Определение, только в стандарте имеется ввиду определение в теле класса.


L_L>В стандарте имеется в виду, что тайпдеф, задающий тип функции, не может использоваться в определении, а может только в объявлении.


+1

Проиллюстрирую:
class C
{
    typedef int pfn(int, int);
    pfn z;
};

//well-formed
int C::z(int, int)
{
    return 0;
}

//ill-formed
C::pfn C::z
{
    return 0;
}
... << RSDN@Home 1.1.4 stable rev. 510>>
Re: Изменение прототипа вирт ф-ции в базовом классе
От: z00n  
Дата: 09.12.05 16:13
Оценка:
Здравствуйте, Аноним, Вы писали:

А> Вопрос в том, как писать безопасный код, гарантированно исключающий такие ситуации?


Мне кажется это именно та проблема, которая решается использованием т.н Nonvirtual Interface pattern (NVI) при проектирвании классов, почитать об этом можно у Саттера: у него на сайте, в CUJ, в поздних книжках (С++ Coding Standards: 101... chapter 39; Exceptional C++ Style chapter 18 etc.)
Re: Изменение прототипа вирт ф-ции в базовом классе
От: Chez Россия  
Дата: 10.12.05 12:13
Оценка: 1 (1) +1
Здравствуйте, <Аноним>, Вы писали:

Исходя из топика, закончившегося этим
Автор: srggal
Дата: 09.12.05
, могу предложить такой вариант:
class Base
{
public:
    typedef int foo_t(int, double);
    virtual foo_t foo;
};

class Derived : public Base
{
public:
    virtual foo_t foo;
};

int Derived::foo(int x, double z)
{
    return 0;
}


Chez, ICQ#161095094

Posted via:RSDN@Home;version:1.1.3;muzikstamp:silent

Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.