static virtual ?
От: purser Россия  
Дата: 24.01.12 11:00
Оценка:
Посоветуйте, пожалуйста, как сделать метод static salt() ещё и виртуальным.
Знаю, что static virtual нельзя, но можно ли обойти без дублирования кода и т.д. ?
#include "stdafx.h"
class Base {
public:
    int static /*virtual*/ salt() {
        return 0;
    }
    int hash() {
        return 10 + salt();
    }
};

class Derived1: public Base {
public:
    int static salt() {
        return 1;
    }
};

class Derived2: public Base {
public:
    int static salt() {
        return 2;
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    int salt_Derived1= Derived1::salt();
    int salt_Derived2= Derived2::salt();

    Derived1* d1= new Derived1;
    int d1_hash= d1->hash();
    return 0;
}
Re: static virtual ?
От: Сыроежка  
Дата: 24.01.12 11:07
Оценка:
Здравствуйте, purser, Вы писали:

P>Посоветуйте, пожалуйста, как сделать метод static salt() ещё и виртуальным.

P>Знаю, что static virtual нельзя, но можно ли обойти без дублирования кода и т.д. ?
P>
P>#include "stdafx.h"
P>class Base {
P>public:
P>    int static /*virtual*/ salt() {
P>        return 0;
P>    }
P>    int hash() {
P>        return 10 + salt();
P>    }
P>};

P>class Derived1: public Base {
P>public:
P>    int static salt() {
P>        return 1;
P>    }
P>};

P>class Derived2: public Base {
P>public:
P>    int static salt() {
P>        return 2;
P>    }
P>};

P>int _tmain(int argc, _TCHAR* argv[])
P>{
P>    int salt_Derived1= Derived1::salt();
P>    int salt_Derived2= Derived2::salt();

P>    Derived1* d1= new Derived1;
P>    int d1_hash= d1->hash();
P>    return 0;
P>}
P>


Почему бы вам функцию hash() не сделать виртуальный, и тогда проблема исчезнет? А статическую функцию salt() сделать закрытой для каждого класса.
Меня можно встретить на www.cpp.forum24.ru
Re[2]: static virtual ?
От: purser Россия  
Дата: 24.01.12 11:15
Оценка:
В том то и дело, что salt() мне нужно вызывать во внешнем коде( как у меня в функции main())

Здравствуйте, Сыроежка, Вы писали:

...

С>Почему бы вам функцию hash() не сделать виртуальный, и тогда проблема исчезнет? А статическую функцию salt() сделать закрытой для каждого класса.
Re: Отдельно Static, отдельно Virtual
От: Qbit86 Кипр
Дата: 24.01.12 11:19
Оценка: 1 (1)
Здравствуйте, purser, Вы писали:

P>Посоветуйте, пожалуйста, как сделать метод static salt() ещё и виртуальным.

P>Знаю, что static virtual нельзя, но можно ли обойти без дублирования кода и т.д. ?

Модификаторы доступа и признаки полиморфности/виртуальности в нижеследующем коде важны, так что я вынес их в названия.
class Base
{
public:
    // int static PublicNonpolymorphicHash() { return 0; } — Этот метод не нужен.
    int PublicNonvirtualPolymorphicHash() const { return 10 + PrivatePolymorphicSalt(); }
protected:
    virtual int PrivatePolymorphicSalt() const = 0; // { return Base::PublicNonpolymorphicHash(); }
};

class Derived1: public Base
{
public:
    int static PublicNonpolymorphicSalt() { return 1; }
private:
    int PrivatePolymorphicSalt() const { return Derived1::PublicNonpolymorphicSalt(); }
};

class Derived2: public Base
{
public:
    int static PublicNonpolymorphicSalt() { return 2; }
private:
    int PrivatePolymorphicSalt() const { return Derived2::PublicNonpolymorphicSalt(); }
};

int main(int argc, char const* argv[])
{
    int salt_Derived1 = Derived1::PublicNonpolymorphicSalt();
    int salt_Derived2 = Derived2::PublicNonpolymorphicSalt();

    Base* d1= new Derived1;
    int d1_hash= d1->PublicNonvirtualPolymorphicHash();
    return 0;
}
Глаза у меня добрые, но рубашка — смирительная!
Re[3]: static virtual ?
От: Сыроежка  
Дата: 24.01.12 11:19
Оценка:
Здравствуйте, purser, Вы писали:

P>В том то и дело, что salt() мне нужно вызывать во внешнем коде( как у меня в функции main())


P>Здравствуйте, Сыроежка, Вы писали:


P>...


Так вы не отреагировали на мое предложение сделать обертку для salt в виде виирутальной функции либо с помощью функции hash, либо какой-нибудь другой.

С>>Почему бы вам функцию hash() не сделать виртуальный, и тогда проблема исчезнет? А статическую функцию salt() сделать закрытой для каждого класса.
Меня можно встретить на www.cpp.forum24.ru
Re[2]: NVI
От: Qbit86 Кипр
Дата: 24.01.12 11:22
Оценка:
Здравствуйте, Сыроежка, Вы писали:

С>Почему бы вам функцию hash() не сделать виртуальный, и тогда проблема исчезнет?


Потому что NVI.
Глаза у меня добрые, но рубашка — смирительная!
Re[2]: Отдельно Static, отдельно Virtual
От: Qbit86 Кипр
Дата: 24.01.12 11:27
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>
Q>class Base
Q>{
Q>public:
Q>    // int static PublicNonpolymorphicHash() { return 0; } — Этот метод не нужен.
Q>    int PublicNonvirtualPolymorphicHash() const { return 10 + PrivatePolymorphicSalt(); }
Q>protected:
Q>    virtual int PrivatePolymorphicSalt() const = 0; // { return Base::PublicNonpolymorphicHash(); }
Q>};
Q>


В классе Base неточность, надо так:
class Base
{
public:
    // int static PublicNonpolymorphicSalt() { return 0; } — Этот метод не нужен.
    int PublicNonvirtualPolymorphicHash() const { return 10 + PrivatePolymorphicSalt(); }
private:
    virtual int PrivatePolymorphicSalt() const = 0; // { return Base::PublicNonpolymorphicSalt(); }
};
Глаза у меня добрые, но рубашка — смирительная!
Re[3]: Отдельно Static, отдельно Virtual
От: purser Россия  
Дата: 24.01.12 11:31
Оценка:
Спасибо большое за решение.
А эта неточность влияет на что-нибудь?

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

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


Q>>
Q>>class Base
Q>>{
Q>>public:
Q>>    // int static PublicNonpolymorphicHash() { return 0; } — Этот метод не нужен.
Q>>    int PublicNonvirtualPolymorphicHash() const { return 10 + PrivatePolymorphicSalt(); }
Q>>protected:
Q>>    virtual int PrivatePolymorphicSalt() const = 0; // { return Base::PublicNonpolymorphicHash(); }
Q>>};
Q>>


Q>В классе Base неточность, надо так:

Q>
Q>class Base
Q>{
Q>public:
Q>    // int static PublicNonpolymorphicSalt() { return 0; } — Этот метод не нужен.
Q>    int PublicNonvirtualPolymorphicHash() const { return 10 + PrivatePolymorphicSalt(); }
Q>private:
Q>    virtual int PrivatePolymorphicSalt() const = 0; // { return Base::PublicNonpolymorphicSalt(); }
Q>};
Q>
Re[3]: NVI
От: Сыроежка  
Дата: 24.01.12 11:34
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Здравствуйте, Сыроежка, Вы писали:


С>>Почему бы вам функцию hash() не сделать виртуальный, и тогда проблема исчезнет?


Q>Потому что NVI.


Не могли бы сами за себя ответить, а не давать ссылку, так как я вижу, что в следующем своем сообщении вы, фактически, повторили то, что я предложил.
Меня можно встретить на www.cpp.forum24.ru
Re[4]: Отдельно Static, отдельно Virtual
От: Qbit86 Кипр
Дата: 24.01.12 11:34
Оценка:
Здравствуйте, purser, Вы писали:

P>А эта неточность влияет на что-нибудь?


Да не особо. Просто неправильно скопипастил название закомментированного метода («hash» вместо «salt»), и использовал не максимально сильный модификатор доступа.
Глаза у меня добрые, но рубашка — смирительная!
Re[4]: NVI
От: Qbit86 Кипр
Дата: 24.01.12 11:39
Оценка:
Здравствуйте, Сыроежка, Вы писали:

С>...так как я вижу, что в следующем своем сообщении вы, фактически, повторили то, что я предложил.


Нет, не то же самое. Если сделать метод hash виртуальным, то пришлось бы дублировать код «10 +». Разница небольшая, но принципиальная. В предложенном же мной подходе (даже не мной, собственно, у Саттера–Александреску это расписано) мы выносим общий код (которого в общем случае больше) в шаблонный метод.
Глаза у меня добрые, но рубашка — смирительная!
Re[5]: NVI
От: Сыроежка  
Дата: 24.01.12 11:54
Оценка: -1
Здравствуйте, Qbit86, Вы писали:

Q>Здравствуйте, Сыроежка, Вы писали:


С>>...так как я вижу, что в следующем своем сообщении вы, фактически, повторили то, что я предложил.


Q>Нет, не то же самое. Если сделать метод hash виртуальным, то пришлось бы дублировать код «10 +». Разница небольшая, но принципиальная. В предложенном же мной подходе (даже не мной, собственно, у Саттера–Александреску это расписано) мы выносим общий код (которого в общем случае больше) в шаблонный метод.


Вы фантазируете!То есть заменяете арргументациию своими фантазиями. Откуда вы взяли дублирование кода? Это все разговоры в пользу бедных. Схема одна и та же — сделать обертку в виде виртуальной функции для статичсеской функции. А куда вы занесете ваше нафантазированное дублирование кода — либо в открытый член-функцию, либо в закрытый член-функцию, если таковое дублирование будет, — это уже не имеет большого значения.
Меня можно встретить на www.cpp.forum24.ru
Re[6]: NVI
От: Qbit86 Кипр
Дата: 24.01.12 12:04
Оценка:
Здравствуйте, Сыроежка, Вы писали:

Q>>Нет, не то же самое. Если сделать метод hash виртуальным, то пришлось бы дублировать код «10 +». Разница небольшая, но принципиальная. В предложенном же мной подходе (даже не мной, собственно, у Саттера–Александреску это расписано) мы выносим общий код (которого в общем случае больше) в шаблонный метод.


С>Вы фантазируете!То есть заменяете арргументациию своими фантазиями.


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

С>Откуда вы взяли дублирование кода? Это все разговоры в пользу бедных.


Я так понимаю, про NVI у Саттера—Александреску ты не читал?
Глаза у меня добрые, но рубашка — смирительная!
Re[7]: NVI
От: Сыроежка  
Дата: 24.01.12 12:15
Оценка: -1
Здравствуйте, Qbit86, Вы писали:

Q>Здравствуйте, Сыроежка, Вы писали:


Q>>>Нет, не то же самое. Если сделать метод hash виртуальным, то пришлось бы дублировать код «10 +». Разница небольшая, но принципиальная. В предложенном же мной подходе (даже не мной, собственно, у Саттера–Александреску это расписано) мы выносим общий код (которого в общем случае больше) в шаблонный метод.


С>>Вы фантазируете!То есть заменяете арргументациию своими фантазиями.


Q>Странно слышать о подмене аргументов фантазиями от человека, который не удосужился привести код в подтверждение своих слов.


С>>Откуда вы взяли дублирование кода? Это все разговоры в пользу бедных.


Q>Я так понимаю, про NVI у Саттера—Александреску ты не читал?


Какой вам нужен код?! Код привел автор вопрса, где он из функции hash() вызывает статическую функцию. Чтобы был полиморфиизм, нужно функцию hash() сделать виртуальной. Что вам здесь не понятно?
И причем здесь Саттер и другие? Вы напоминаете молодого человека, который прочитал книжку, а теперь везде сует из нее прочитанное, не вникая, что предлагают другие и даже не понимая, что он сам предлагает! Мужде прочим в вашем примере нет статической функции. Обхяснить вам, что вы сами предлагаете, или самостоятельно догадаетесь?
Меня можно встретить на www.cpp.forum24.ru
Re[8]: NVI
От: Qbit86 Кипр
Дата: 24.01.12 12:28
Оценка:
Здравствуйте, Сыроежка, Вы писали:

С>Чтобы был полиморфиизм, нужно функцию hash() сделать виртуальной. Что вам здесь не понятно?


Не нужно. Что я и продемонстрировал в коде. И подчеркнул названием. Функция PublicNonvirtualPolymorphicHash не виртуальна, но тем не менее является полиморфной.

С>Какой вам нужен код?! Код привел автор вопрса, где он из функции hash() вызывает статическую функцию.


Код того, что ты предлагаешь. Виртуальная публичная hash() и всё такое. Полноценный компилирующийся и рабочий кусок кода.

С>И причем здесь Саттер и другие?


Прежде, чем решать задачу (а тем более давать советы), полезно изучить известные образцы.

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


Это стандартная отмазка невежественных и ограниченных людей. Эдакое оправдание своей неотёсанности и нежелания обучаться.

С>Мужде прочим в вашем примере нет статической функции.


У меня в примере аж две статические функции и ещё одна необязательная закомментирована.

С>Обхяснить вам, что вы сами предлагаете, или самостоятельно догадаетесь?


Давай-давай.
Глаза у меня добрые, но рубашка — смирительная!
Re[9]: NVI
От: Сыроежка  
Дата: 24.01.12 12:38
Оценка: :)
Здравствуйте, Qbit86, Вы писали:

Q>Здравствуйте, Сыроежка, Вы писали:


С>>Чтобы был полиморфиизм, нужно функцию hash() сделать виртуальной. Что вам здесь не понятно?


Q>Не нужно. Что я и продемонстрировал в коде. И подчеркнул названием. Функция PublicNonvirtualPolymorphicHash не виртуальна, но тем не менее является полиморфной.


С>>Какой вам нужен код?! Код привел автор вопрса, где он из функции hash() вызывает статическую функцию.


Q>Код того, что ты предлагаешь. Виртуальная публичная hash() и всё такое. Полноценный компилирующийся и рабочий кусок кода.


С>>И причем здесь Саттер и другие?


Q>Прежде, чем решать задачу (а тем более давать советы), полезно изучить известные образцы.


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


Q>Это стандартная отмазка невежественных и ограниченных людей. Эдакое оправдание своей неотёсанности и нежелания обучаться.


С>>Мужде прочим в вашем примере нет статической функции.


Q>У меня в примере аж две статические функции и ещё одна необязательная закомментирована.


С>>Обхяснить вам, что вы сами предлагаете, или самостоятельно догадаетесь?


Q>Давай-давай.


Много пустопорожних слов! Вы вообще-то по существу отвечать в состоянии? Во-первых, нде вы увидели дублирование кода, на которое вы ссылаетесь, в моем предложении? Если вы говорите о дублировании кода, то покадитте, какой код и где дублируется. А то, с одной стороны, вы говорите о моем дублировании кода, а, сдругой стороны, вы говорите, что не видите мой код. У вас раздвоение личности?
На всяких там Саттеров ссыллаются, как это делаете вы, когда сами ничего толком сказать не могут. А поэтому заполняют пробел в своем незнании ссылкой на всяких Саттеров.
В вашем примере базового класса

class Base
{
public:
// int static PublicNonpolymorphicSalt() { return 0; } — Этот метод не нужен.
int PublicNonvirtualPolymorphicHash() const { return 10 + PrivatePolymorphicSalt(); }
private:
virtual int PrivatePolymorphicSalt() const = 0; // { return Base::PublicNonpolymorphicSalt(); }
};
нет ни одной статической функции. Есть две функции: одна открытая невиртуальная, а другая закрытая виртуальная. А где в базовом классе статическая функция?
Но самое главное кроме ваших фантазий по поводу дублирования, якобы, у моего предложения кода, никаких возражений против предложеннрнр мною метода нет.
Меня можно встретить на www.cpp.forum24.ru
Re[10]: NVI
От: Qbit86 Кипр
Дата: 24.01.12 12:57
Оценка:
Здравствуйте, Сыроежка, Вы писали:

С>Много пустопорожних слов!


С твоей стороны. С моей стороны — код, ссылка и рациональная аргументация.

С>Вы вообще-то по существу отвечать в состоянии?


В нашем диалоге по существу отвечаю только я.

С>Во-первых, нде вы увидели дублирование кода, на которое вы ссылаетесь, в моем предложении? Если вы говорите о дублировании кода, то покадитте, какой код и где дублируется. А то, с одной стороны, вы говорите о моем дублировании кода, а, сдругой стороны, вы говорите, что не видите мой код.


Я просто сделал предположение о твоём гипотетическом варианте (смотреть-то не на что). Но ты можешь его доблестно опровергнуть, таки осилив предъявить ну хоть что-нибудь.

С>У вас раздвоение личности?


Насколько я знаю, нет. А почему ты спрашиваешь? Ты намереваешься меня оскорбить?

С>На всяких там Саттеров ссыллаются, как это делаете вы, когда сами ничего толком сказать не могут.


Да-да, ссылки надо запретить! Книжки сжечь! «Дабы разумением своим не смущать начальство.»

С>А поэтому заполняют пробел в своем незнании ссылкой на всяких Саттеров.


Пробел в своём незнании заполняют чтением. А в чужом — да, можно ссылкой на прочитанное, почему нет.

С>Мужде прочим в вашем примере нет статической функции...

С>В вашем примере базового класса

Так в «моём примере» или в «моём примере базового класса»?

С>А где в базовом классе статическая функция?


Написано в комментарии после тире:
// int static PublicNonpolymorphicHash() { return 0; } — Этот метод не нужен.

Сосредоточься, будь внимательней.

С>Но самое главное кроме ваших фантазий по поводу дублирования, якобы, у моего предложения кода, никаких возражений против предложеннрнр мною метода нет.


Тобой никакой метод кроме невнятного бормотания не предложен. Code or GTFO.
Глаза у меня добрые, но рубашка — смирительная!
Re[11]: NVI
От: Сыроежка  
Дата: 24.01.12 13:16
Оценка: -1
Здравствуйте, Qbit86, Вы писали:


Q>Я просто сделал предположение о твоём гипотетическом варианте (смотреть-то не на что). Но ты можешь его доблестно опровергнуть, таки осилив предъявить ну хоть что-нибудь.


Так я еще раз повторяЮ, что ваши фантазии никому не интересны! Вы предполагать можете все, что угодно, что, например, вы — Джеймс Бонд, только мне то какое дело до ваших фантазий?


Q>Написано в комментарии после тире:

Q>
Q>// int static PublicNonpolymorphicHash() { return 0; } — Этот метод не нужен.
Q>

Q>Сосредоточься, будь внимательней.

Так из этого следуетт, что вы на самом деле не отвтили на исходный вопрос. Вопрос касался статической функции, как статическую функцию сделать "виртуальной", то есть не отказаться от статической функции, а сделать так, чтобы доступ к ней, то есть к [b]статической функции[/b] имитировал полиморфизм.

Но для вас что главное? Не арргументировать свои высказывания, направленные против других предложений, а продемонстрировать, что вы читали какую-то книгу! А для этого надо очень громко заявить, что вы читали книгу, а то, вдруг, дрругие не услышат. А для того, чтобы к себе привлечь внимание, надо сходу отверрнуть другие предложения, не так ли?
Меня можно встретить на www.cpp.forum24.ru
Re[12]: NVI
От: samius Япония http://sams-tricks.blogspot.com
Дата: 24.01.12 13:24
Оценка:
Здравствуйте, Сыроежка, Вы писали:

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



Q>>Я просто сделал предположение о твоём гипотетическом варианте (смотреть-то не на что). Но ты можешь его доблестно опровергнуть, таки осилив предъявить ну хоть что-нибудь.


С>Так я еще раз повторяЮ, что ваши фантазии никому не интересны! Вы предполагать можете все, что угодно, что, например, вы — Джеймс Бонд, только мне то какое дело до ваших фантазий?


Вы наверное полагаете что ваши фантазии должны быть кому-то интересны после этого?
Re[12]: Code or GTFO
От: Qbit86 Кипр
Дата: 24.01.12 13:30
Оценка: +1
Здравствуйте, Сыроежка, Вы писали:

С>Так я еще раз повторяЮ, что ваши фантазии никому не интересны!


Тебе-то точно неинтересны, судя по объёму генерируемого тобой бессодержательного текста. Порассказывай ещё, как они тебе безразличны.

С>Вы предполагать можете все, что угодно, что, например, вы — Джеймс Бонд, только мне то какое дело до ваших фантазий?


Никакого и никакого, дело с концом. Так зачем ты продолжаешь в треде потешать почтенную публику?

С>Так из этого следуетт, что вы на самом деле не отвтили на исходный вопрос. Вопрос касался статической функции, как статическую функцию сделать "виртуальной", то есть не отказаться от статической функции, а сделать так, чтобы доступ к ней, то есть к [b]статической функции[/b] имитировал полиморфизм.


Ох, фейспалм. Ты, похоже, даже примерно не понял, в чём проблема.

С>Но для вас что главное? Не арргументировать свои высказывания, направленные против других предложений, а продемонстрировать, что вы читали какую-то книгу!


Сабж.
Глаза у меня добрые, но рубашка — смирительная!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.