Посоветуйте, пожалуйста, как сделать метод 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;
}
Здравствуйте, 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() сделать закрытой для каждого класса.
В том то и дело, что salt() мне нужно вызывать во внешнем коде( как у меня в функции main())
Здравствуйте, Сыроежка, Вы писали:
...
С>Почему бы вам функцию hash() не сделать виртуальный, и тогда проблема исчезнет? А статическую функцию salt() сделать закрытой для каждого класса.
Здравствуйте, 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;
}
Здравствуйте, purser, Вы писали:
P>В том то и дело, что salt() мне нужно вызывать во внешнем коде( как у меня в функции main())
P>Здравствуйте, Сыроежка, Вы писали:
P>...
Так вы не отреагировали на мое предложение сделать обертку для salt в виде виирутальной функции либо с помощью функции hash, либо какой-нибудь другой.
С>>Почему бы вам функцию hash() не сделать виртуальный, и тогда проблема исчезнет? А статическую функцию salt() сделать закрытой для каждого класса.
Здравствуйте, Qbit86, Вы писали:
Q>Здравствуйте, Сыроежка, Вы писали:
С>>Почему бы вам функцию hash() не сделать виртуальный, и тогда проблема исчезнет?
Q>Потому что NVI.
Не могли бы сами за себя ответить, а не давать ссылку, так как я вижу, что в следующем своем сообщении вы, фактически, повторили то, что я предложил.
Здравствуйте, purser, Вы писали:
P>А эта неточность влияет на что-нибудь?
Да не особо. Просто неправильно скопипастил название закомментированного метода («hash» вместо «salt»), и использовал не максимально сильный модификатор доступа.
Здравствуйте, Сыроежка, Вы писали:
С>...так как я вижу, что в следующем своем сообщении вы, фактически, повторили то, что я предложил.
Нет, не то же самое. Если сделать метод hash виртуальным, то пришлось бы дублировать код «10 +». Разница небольшая, но принципиальная. В предложенном же мной подходе (даже не мной, собственно, у Саттера–Александреску это расписано) мы выносим общий код (которого в общем случае больше) в шаблонный метод.
Здравствуйте, Qbit86, Вы писали:
Q>Здравствуйте, Сыроежка, Вы писали:
С>>...так как я вижу, что в следующем своем сообщении вы, фактически, повторили то, что я предложил.
Q>Нет, не то же самое. Если сделать метод hash виртуальным, то пришлось бы дублировать код «10 +». Разница небольшая, но принципиальная. В предложенном же мной подходе (даже не мной, собственно, у Саттера–Александреску это расписано) мы выносим общий код (которого в общем случае больше) в шаблонный метод.
Вы фантазируете!То есть заменяете арргументациию своими фантазиями. Откуда вы взяли дублирование кода? Это все разговоры в пользу бедных. Схема одна и та же — сделать обертку в виде виртуальной функции для статичсеской функции. А куда вы занесете ваше нафантазированное дублирование кода — либо в открытый член-функцию, либо в закрытый член-функцию, если таковое дублирование будет, — это уже не имеет большого значения.
Здравствуйте, Сыроежка, Вы писали:
Q>>Нет, не то же самое. Если сделать метод hash виртуальным, то пришлось бы дублировать код «10 +». Разница небольшая, но принципиальная. В предложенном же мной подходе (даже не мной, собственно, у Саттера–Александреску это расписано) мы выносим общий код (которого в общем случае больше) в шаблонный метод.
С>Вы фантазируете!То есть заменяете арргументациию своими фантазиями.
Странно слышать о подмене аргументов фантазиями от человека, который не удосужился привести код в подтверждение своих слов.
С>Откуда вы взяли дублирование кода? Это все разговоры в пользу бедных.
Я так понимаю, про NVI у Саттера—Александреску ты не читал?
Здравствуйте, Qbit86, Вы писали:
Q>Здравствуйте, Сыроежка, Вы писали:
Q>>>Нет, не то же самое. Если сделать метод hash виртуальным, то пришлось бы дублировать код «10 +». Разница небольшая, но принципиальная. В предложенном же мной подходе (даже не мной, собственно, у Саттера–Александреску это расписано) мы выносим общий код (которого в общем случае больше) в шаблонный метод.
С>>Вы фантазируете!То есть заменяете арргументациию своими фантазиями.
Q>Странно слышать о подмене аргументов фантазиями от человека, который не удосужился привести код в подтверждение своих слов.
С>>Откуда вы взяли дублирование кода? Это все разговоры в пользу бедных.
Q>Я так понимаю, про NVI у Саттера—Александреску ты не читал?
Какой вам нужен код?! Код привел автор вопрса, где он из функции hash() вызывает статическую функцию. Чтобы был полиморфиизм, нужно функцию hash() сделать виртуальной. Что вам здесь не понятно?
И причем здесь Саттер и другие? Вы напоминаете молодого человека, который прочитал книжку, а теперь везде сует из нее прочитанное, не вникая, что предлагают другие и даже не понимая, что он сам предлагает! Мужде прочим в вашем примере нет статической функции. Обхяснить вам, что вы сами предлагаете, или самостоятельно догадаетесь?
Здравствуйте, Сыроежка, Вы писали:
С>Чтобы был полиморфиизм, нужно функцию hash() сделать виртуальной. Что вам здесь не понятно?
Не нужно. Что я и продемонстрировал в коде. И подчеркнул названием. Функция PublicNonvirtualPolymorphicHash не виртуальна, но тем не менее является полиморфной.
С>Какой вам нужен код?! Код привел автор вопрса, где он из функции hash() вызывает статическую функцию.
Код того, что ты предлагаешь. Виртуальная публичная hash() и всё такое. Полноценный компилирующийся и рабочий кусок кода.
С>И причем здесь Саттер и другие?
Прежде, чем решать задачу (а тем более давать советы), полезно изучить известные образцы.
С>Вы напоминаете молодого человека, который прочитал книжку, а теперь везде сует из нее прочитанное, не вникая, что предлагают другие и даже не понимая, что он сам предлагает!
Это стандартная отмазка невежественных и ограниченных людей. Эдакое оправдание своей неотёсанности и нежелания обучаться.
С>Мужде прочим в вашем примере нет статической функции.
У меня в примере аж две статические функции и ещё одна необязательная закомментирована.
С>Обхяснить вам, что вы сами предлагаете, или самостоятельно догадаетесь?
Здравствуйте, 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(); }
};
нет ни одной статической функции. Есть две функции: одна открытая невиртуальная, а другая закрытая виртуальная. А где в базовом классе статическая функция?
Но самое главное кроме ваших фантазий по поводу дублирования, якобы, у моего предложения кода, никаких возражений против предложеннрнр мною метода нет.
Здравствуйте, Сыроежка, Вы писали:
С>Много пустопорожних слов!
С твоей стороны. С моей стороны — код, ссылка и рациональная аргументация.
С>Вы вообще-то по существу отвечать в состоянии?
В нашем диалоге по существу отвечаю только я.
С>Во-первых, нде вы увидели дублирование кода, на которое вы ссылаетесь, в моем предложении? Если вы говорите о дублировании кода, то покадитте, какой код и где дублируется. А то, с одной стороны, вы говорите о моем дублировании кода, а, сдругой стороны, вы говорите, что не видите мой код.
Я просто сделал предположение о твоём гипотетическом варианте (смотреть-то не на что). Но ты можешь его доблестно опровергнуть, таки осилив предъявить ну хоть что-нибудь.
С>У вас раздвоение личности?
Насколько я знаю, нет. А почему ты спрашиваешь? Ты намереваешься меня оскорбить?
С>На всяких там Саттеров ссыллаются, как это делаете вы, когда сами ничего толком сказать не могут.
Да-да, ссылки надо запретить! Книжки сжечь! «Дабы разумением своим не смущать начальство.»
С>А поэтому заполняют пробел в своем незнании ссылкой на всяких Саттеров.
Пробел в своём незнании заполняют чтением. А в чужом — да, можно ссылкой на прочитанное, почему нет.
С>Мужде прочим в вашем примере нет статической функции... С>В вашем примере базового класса
Так в «моём примере» или в «моём примере базового класса»?
С>А где в базовом классе статическая функция?
Написано в комментарии после тире:
// int static PublicNonpolymorphicHash() { return 0; } — Этот метод не нужен.
Сосредоточься, будь внимательней.
С>Но самое главное кроме ваших фантазий по поводу дублирования, якобы, у моего предложения кода, никаких возражений против предложеннрнр мною метода нет.
Тобой никакой метод кроме невнятного бормотания не предложен. Code or GTFO.
Q>Я просто сделал предположение о твоём гипотетическом варианте (смотреть-то не на что). Но ты можешь его доблестно опровергнуть, таки осилив предъявить ну хоть что-нибудь.
Так я еще раз повторяЮ, что ваши фантазии никому не интересны! Вы предполагать можете все, что угодно, что, например, вы — Джеймс Бонд, только мне то какое дело до ваших фантазий?
Q>Написано в комментарии после тире: Q>
Q>// int static PublicNonpolymorphicHash() { return 0; } — Этот метод не нужен.
Q>
Q>Сосредоточься, будь внимательней.
Так из этого следуетт, что вы на самом деле не отвтили на исходный вопрос. Вопрос касался статической функции, как статическую функцию сделать "виртуальной", то есть не отказаться от статической функции, а сделать так, чтобы доступ к ней, то есть к [b]статической функции[/b] имитировал полиморфизм.
Но для вас что главное? Не арргументировать свои высказывания, направленные против других предложений, а продемонстрировать, что вы читали какую-то книгу! А для этого надо очень громко заявить, что вы читали книгу, а то, вдруг, дрругие не услышат. А для того, чтобы к себе привлечь внимание, надо сходу отверрнуть другие предложения, не так ли?
Здравствуйте, Сыроежка, Вы писали:
С>Здравствуйте, Qbit86, Вы писали:
Q>>Я просто сделал предположение о твоём гипотетическом варианте (смотреть-то не на что). Но ты можешь его доблестно опровергнуть, таки осилив предъявить ну хоть что-нибудь.
С>Так я еще раз повторяЮ, что ваши фантазии никому не интересны! Вы предполагать можете все, что угодно, что, например, вы — Джеймс Бонд, только мне то какое дело до ваших фантазий?
Вы наверное полагаете что ваши фантазии должны быть кому-то интересны после этого?
Здравствуйте, Сыроежка, Вы писали:
С>Так я еще раз повторяЮ, что ваши фантазии никому не интересны!
Тебе-то точно неинтересны, судя по объёму генерируемого тобой бессодержательного текста. Порассказывай ещё, как они тебе безразличны.
С>Вы предполагать можете все, что угодно, что, например, вы — Джеймс Бонд, только мне то какое дело до ваших фантазий?
Никакого и никакого, дело с концом. Так зачем ты продолжаешь в треде потешать почтенную публику?
С>Так из этого следуетт, что вы на самом деле не отвтили на исходный вопрос. Вопрос касался статической функции, как статическую функцию сделать "виртуальной", то есть не отказаться от статической функции, а сделать так, чтобы доступ к ней, то есть к [b]статической функции[/b] имитировал полиморфизм.
Ох, фейспалм. Ты, похоже, даже примерно не понял, в чём проблема.
С>Но для вас что главное? Не арргументировать свои высказывания, направленные против других предложений, а продемонстрировать, что вы читали какую-то книгу!
Здравствуйте, samius, Вы писали:
S>Здравствуйте, Сыроежка, Вы писали:
С>>Здравствуйте, Qbit86, Вы писали:
Q>>>Я просто сделал предположение о твоём гипотетическом варианте (смотреть-то не на что). Но ты можешь его доблестно опровергнуть, таки осилив предъявить ну хоть что-нибудь.
С>>Так я еще раз повторяЮ, что ваши фантазии никому не интересны! Вы предполагать можете все, что угодно, что, например, вы — Джеймс Бонд, только мне то какое дело до ваших фантазий?
S>Вы наверное полагаете что ваши фантазии должны быть кому-то интересны после этого?
А моих фантазий нет! Я не делаю никаких предположений о каких-то гипотетических варианатх, как это делает Qbit86. Он сначала делает какие-то совершенно ничем не подкрепленные предположения, а потом предлагает эти свои фантазии другим опроверргнуть.
В мооем исходном предложении, которое я процитирую, "Почему бы вам функцию hash() не сделать виртуальный, и тогда проблема исчезнет? А статическую функцию salt() сделать закрытой для каждого класса.", был предложен путь, как можно решить проблему. Откуда Qbit86 высосал о дублировании кода?! И как он вообще мог об этом заявить, если он же сам признается, что огн моего кода не виидел?! Смешно, да и только!
Здравствуйте, Сыроежка, Вы писали:
С>Здравствуйте, samius, Вы писали:
С>>>Так я еще раз повторяЮ, что ваши фантазии никому не интересны! Вы предполагать можете все, что угодно, что, например, вы — Джеймс Бонд, только мне то какое дело до ваших фантазий?
S>>Вы наверное полагаете что ваши фантазии должны быть кому-то интересны после этого?
С>А моих фантазий нет! Я не делаю никаких предположений о каких-то гипотетических варианатх, как это делает Qbit86. Он сначала делает какие-то совершенно ничем не подкрепленные предположения, а потом предлагает эти свои фантазии другим опроверргнуть. С>В мооем исходном предложении, которое я процитирую, "Почему бы вам функцию hash() не сделать виртуальный, и тогда проблема исчезнет? А статическую функцию salt() сделать закрытой для каждого класса.", был предложен путь, как можно решить проблему. Откуда Qbit86 высосал о дублировании кода?! И как он вообще мог об этом заявить, если он же сам признается, что огн моего кода не виидел?! Смешно, да и только!
Вы все еще полагаете что это кому-то должно быть интересно читать? Вот это ^^^ и ему подобное?
Здравствуйте, Qbit86, Вы писали:
Q>Здравствуйте, Сыроежка, Вы писали:
С>>Так я еще раз повторяЮ, что ваши фантазии никому не интересны!
Q>Тебе-то точно неинтересны, судя по объёму генерируемого тобой бессодержательного текста. Порассказывай ещё, как они тебе безразличны.
С>>Вы предполагать можете все, что угодно, что, например, вы — Джеймс Бонд, только мне то какое дело до ваших фантазий?
Q>Никакого и никакого, дело с концом. Так зачем ты продолжаешь в треде потешать почтенную публику?
С>>Так из этого следуетт, что вы на самом деле не отвтили на исходный вопрос. Вопрос касался статической функции, как статическую функцию сделать "виртуальной", то есть не отказаться от статической функции, а сделать так, чтобы доступ к ней, то есть к [b]статической функции[/b] имитировал полиморфизм.
Q>Ох, фейспалм. Ты, похоже, даже примерно не понял, в чём проблема.
С>>Но для вас что главное? Не арргументировать свои высказывания, направленные против других предложений, а продемонстрировать, что вы читали какую-то книгу!
Q>Сабж.
Я так и не уидел обоснованного объяснение голословного утверждения, где происходит дублирование кода, но зато услышал в ответ кучу пустопорожнего звона.
Единственное, что я хотел от вас добиться, это услышать обоснование вашего безапелляционного утверждения, но, как оказалось, это бесполезно. Вы не несете ответсвенность за то, что направо и налево заявляете.
Как говорил один киногерой, я люблю умных людей, но не люблю умников.
Когда вместо конкретного ответа потоком идет словоблудие, то это ничего хорошо о вас ни как оч еловеке, ни как о программисте не говорит.
Здравствуйте, samius, Вы писали:
S>Здравствуйте, Сыроежка, Вы писали:
С>>Здравствуйте, samius, Вы писали:
С>>>>Так я еще раз повторяЮ, что ваши фантазии никому не интересны! Вы предполагать можете все, что угодно, что, например, вы — Джеймс Бонд, только мне то какое дело до ваших фантазий?
S>>>Вы наверное полагаете что ваши фантазии должны быть кому-то интересны после этого?
С>>А моих фантазий нет! Я не делаю никаких предположений о каких-то гипотетических варианатх, как это делает Qbit86. Он сначала делает какие-то совершенно ничем не подкрепленные предположения, а потом предлагает эти свои фантазии другим опроверргнуть. С>>В мооем исходном предложении, которое я процитирую, "Почему бы вам функцию hash() не сделать виртуальный, и тогда проблема исчезнет? А статическую функцию salt() сделать закрытой для каждого класса.", был предложен путь, как можно решить проблему. Откуда Qbit86 высосал о дублировании кода?! И как он вообще мог об этом заявить, если он же сам признается, что огн моего кода не виидел?! Смешно, да и только!
S>Вы все еще полагаете что это кому-то должно быть интересно читать? Вот это ^^^ и ему подобное?
А почему вы ко мне обращщаетесь, а не к Qbit86?! Я лишь хотел услышать от него, на основании чего он сделал заключение о дублировании кода.
Мне лично тоже не интересно читать ни его ^^^, ни ваше ^^^. Мне бы было интересно прочитать аргументированное объяснение высказывания Qbit86. Но этого нет, а есть лишь его ^^^, да еще ваше появившееся ^^^.
С>В мооем исходном предложении, которое я процитирую, "Почему бы вам функцию hash() не сделать виртуальный, и тогда проблема исчезнет? А статическую функцию salt() сделать закрытой для каждого класса.", был предложен путь, как можно решить проблему. Откуда Qbit86 высосал о дублировании кода?! И как он вообще мог об этом заявить, если он же сам признается, что огн моего кода не виидел?! Смешно, да и только!
Если сделать hash() виртуальной, то в каждом потомке нужно будет её определить — отсюда дублирование, так как hash() один и тот же.
Если сделать salt() закрытой, то её нельзя будет вызвать во внешнем коде (см. main() в моем примере).
Здравствуйте, Сыроежка, Вы писали:
С>Здравствуйте, samius, Вы писали:
С>А почему вы ко мне обращщаетесь, а не к Qbit86?! Я лишь хотел услышать от него, на основании чего он сделал заключение о дублировании кода.
Потому что срач тут разводите именно вы.
С>Мне лично тоже не интересно читать ни его ^^^, ни ваше ^^^. Мне бы было интересно прочитать аргументированное объяснение высказывания Qbit86. Но этого нет, а есть лишь его ^^^, да еще ваше появившееся ^^^.
То его мнение интересно, то не интересно, теперь опять интересно, причем в соседних предложениях. Экий вы ветренный.
Если вам действительно что-то интересно — учитесь прежде уважать чужое мнение. Тогда им с вами охотно поделятся.
Здравствуйте, samius, Вы писали:
S>Здравствуйте, Сыроежка, Вы писали:
С>>Здравствуйте, samius, Вы писали:
С>>А почему вы ко мне обращщаетесь, а не к Qbit86?! Я лишь хотел услышать от него, на основании чего он сделал заключение о дублировании кода. S>Потому что срач тут разводите именно вы.
С>>Мне лично тоже не интересно читать ни его ^^^, ни ваше ^^^. Мне бы было интересно прочитать аргументированное объяснение высказывания Qbit86. Но этого нет, а есть лишь его ^^^, да еще ваше появившееся ^^^. S>То его мнение интересно, то не интересно, теперь опять интересно, причем в соседних предложениях. Экий вы ветренный.
S>Если вам действительно что-то интересно — учитесь прежде уважать чужое мнение. Тогда им с вами охотно поделятся.
Я не понимаю, а что вы влезли-то?! Вопрос стоит не об неком абстрактном уважении чьего-то мнения, а об обосновании мнения, так как программирование — это не гадание на кофейной гуще! Он наверное ваш приятель, что вы также началли разводить флуд?!
Здравствуйте, purser, Вы писали:
С>>В мооем исходном предложении, которое я процитирую, "Почему бы вам функцию hash() не сделать виртуальный, и тогда проблема исчезнет? А статическую функцию salt() сделать закрытой для каждого класса.", был предложен путь, как можно решить проблему. Откуда Qbit86 высосал о дублировании кода?! И как он вообще мог об этом заявить, если он же сам признается, что огн моего кода не виидел?! Смешно, да и только!
P>Если сделать hash() виртуальной, то в каждом потомке нужно будет её определить — отсюда дублирование, так как hash() один и тот же. P>Если сделать salt() закрытой, то её нельзя будет вызвать во внешнем коде (см. main() в моем примере).
Так вопрос с открытым членом или с закрытым — это не принципиально! Сделайте функцию открытой, какие проблемы?
А что касается вашего объяснения о дублировании кода, то почему же в другом варианте нет дублировании кода? Разве там не надо в каждом классе объявлять виртуальную функцию, к которой обращается не виртуальная? В чем принципиальная разница относительно дублирования кода?!
P.S. Между прочим я и хотел добиться обоснования, а в ответ посыпался флуд на демяток сообщений! Да еще один умник (не вы) влез с целью продолжить разводить флуд!
Здравствуйте, Сыроежка, Вы писали:
С>Здравствуйте, samius, Вы писали:
С>Я не понимаю, а что вы влезли-то?! Вопрос стоит не об неком абстрактном уважении чьего-то мнения, а об обосновании мнения, так как программирование — это не гадание на кофейной гуще! Он наверное ваш приятель, что вы также началли разводить флуд?!
Я влез потому что мне неприятны ваши манеры.
Ну а пусть бы и приятель, ничего дурного в том что бы иметь приятелей я не вижу. Иметь приятелей гораздо лучше, чем иметь дурные манеры.
Здравствуйте, purser, Вы писали:
P>Посоветуйте, пожалуйста, как сделать метод static salt() ещё и виртуальным. P>Знаю, что static virtual нельзя, но можно ли обойти без дублирования кода и т.д. ? P>...
Возможно, этот тот случай, когда имеет смысл динамический полиморфизм заменить статическим:
class IBase
{
public:
virtual int hash() = 0;
//...
};
template<int saltValue>
class StdBase : public IBase
{
public:
static const int salt = saltValue;
virtual int hash() { return 10 + salt; }
};
class Derived1: public StdBase<1> {};
class Derived2: public StdBase<2> {};
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, Сыроежка, Вы писали:
С>Здравствуйте, purser, Вы писали:
С>>>В мооем исходном предложении, которое я процитирую, "Почему бы вам функцию hash() не сделать виртуальный, и тогда проблема исчезнет? А статическую функцию salt() сделать закрытой для каждого класса.", был предложен путь, как можно решить проблему. Откуда Qbit86 высосал о дублировании кода?! И как он вообще мог об этом заявить, если он же сам признается, что огн моего кода не виидел?! Смешно, да и только!
P>>Если сделать hash() виртуальной, то в каждом потомке нужно будет её определить — отсюда дублирование, так как hash() один и тот же. P>>Если сделать salt() закрытой, то её нельзя будет вызвать во внешнем коде (см. main() в моем примере).
С>А что касается вашего объяснения о дублировании кода, то почему же в другом варианте нет дублировании кода? Разве там не надо в каждом классе объявлять виртуальную функцию, к которой обращается не виртуальная? В чем принципиальная разница относительно дублирования кода?!
Разница в том, где дублирования меньше. В идеале мне нужна конструкция по семантике сходная со static virtual, но раз её нет,
то костыли, которые предложил Qbit86, наверное, наименьшее зло. Да, приходится создавать "лишнюю" виртуальную функцию в каждом наследнике. Дублирование функции hash() может в дальнейшем обернуться бОльшими проблемами, поскольку она больше подвержена изменениям чем простая функция-затычка из одного return.
Здравствуйте, purser, Вы писали:
P>Здравствуйте, Сыроежка, Вы писали:
С>>Здравствуйте, purser, Вы писали:
С>>>>В мооем исходном предложении, которое я процитирую, "Почему бы вам функцию hash() не сделать виртуальный, и тогда проблема исчезнет? А статическую функцию salt() сделать закрытой для каждого класса.", был предложен путь, как можно решить проблему. Откуда Qbit86 высосал о дублировании кода?! И как он вообще мог об этом заявить, если он же сам признается, что огн моего кода не виидел?! Смешно, да и только!
P>>>Если сделать hash() виртуальной, то в каждом потомке нужно будет её определить — отсюда дублирование, так как hash() один и тот же. P>>>Если сделать salt() закрытой, то её нельзя будет вызвать во внешнем коде (см. main() в моем примере).
С>>А что касается вашего объяснения о дублировании кода, то почему же в другом варианте нет дублировании кода? Разве там не надо в каждом классе объявлять виртуальную функцию, к которой обращается не виртуальная? В чем принципиальная разница относительно дублирования кода?!
P>Разница в том, где дублирования меньше. В идеале мне нужна конструкция по семантике сходная со static virtual, но раз её нет, P>то костыли, которые предложил Qbit86, наверное, наименьшее зло. Да, приходится создавать "лишнюю" виртуальную функцию в каждом наследнике. Дублирование функции hash() может в дальнейшем обернуться бОльшими проблемами, поскольку она больше подвержена изменениям чем простая функция-затычка из одного return.
Как раз дублирования, в варианте, который предложил Qbit86, больше, так как каждая функция должна принимать указатель на исходный обюъект класса. То есть объектный код становится гораздо больше и менее эффектиным, так как нужно передавать дополнительный агумент в функцию. А в вашем случае это совершенно не нужно, так как вы вели речь о статической функции. Сделал функцию hash виртуальной, вы избавитесь от всех своих проблем. При этом статическую функцию, если это вам так очень нужно (в чем я сильно сомневаюсь) можете оставить открытой. Но это конечно ваше личное дело, так как мы не знаем все тонокости вашей реализации.
Здравствуйте, purser, Вы писали:
P>Посоветуйте, пожалуйста, как сделать метод static salt() ещё и виртуальным. P>Знаю, что static virtual нельзя, но можно ли обойти без дублирования кода и т.д. ?
Зависит от того, в какой момент возникает полиморфизм.
Если в рантайме (т.е. дано: Base* something, и нужно, чтобы something->salt() вернул соль для фактического типа) — то придётся использовать косвенности.
Навскидку:
— хранить соль в каждом объекте (something->m_salt)
— виртуальная функция
— указатель на функцию
— тэги и табличная функция (грубо говоря, switch(something->m_typeid) какой-нибудь)
Если же во время компиляции (т.е. Derived123* something и даже просто Derived123::salt()), то можем прибегнуть к способностям компилятора по выводу типов и поиску имён.
Самое дубовое — это просто сделать внешние функции salt и hash, зависящие от типа
// здесь в качестве тэга выбран указатель на тип (это обеспечивает наследование функций через приведение типа указателя)int the_salt(Base*) { return 0; }
int the_salt(Derived1*) { return 1234; }
int the_salt(Derived2*) { return 567; }
// здесь указатель на тип играет и роль тэга, и передаёт данныеint the_hash(Base* p, int seed) { ....... }
int the_hash(Derived3* p, int seed) { ..... }
template<class T>
int hash(T* p) { return the_hash(p, the_salt((T*)0)); }
// а если наследование нежелательно, то можно использовать шаблон тэгаtemplate<class T> struct type_tag {};
int the_salt(type_tag<Base>);
int the_salt(type_tag<Derived1>);
.....
int the_hash(type_tag<Base>, Base* p, int seed);
.....
template<class T>
int hash(T* p) { return the_hash(type_tag<T>(), p, the_salt(type_tag<T>()));
Возможно, что тебе нужен CRTP — это практически полный аналог виртуальным функциям, только во время компиляции.
template<class Final> class Base
{
public:
// это паттерн "Шаблонный метод": собираем функцию из полиморфных кусочковint hash() const { return get_hash(get_salt()); }
private:
// примитивы Шаблонного Метода - чтобы не загромождать его кодstatic int get_salt() { return Final::the_salt(); } // вызов статической функции наследникаint get_hash(int seed) const { return static_cast<Final*>(this)->the_hash(seed); } // вызов функции-члена наследникаpublic:
// дефолтные реализации (без них это был бы аналог чисто виртуальных функций)static int the_seed() { return 0; }
static int the_hash(int seed) { return seed; }
};
// промежуточные наследники должны принимать форму CRTPtemplate<class Final> class Derived1T : public Base<Final>
{
public:
static int the_seed() { return 123; }
.....
};
class Derived1 : public Derived1T<Derived> {};
// запаянный наследник (от которого никто более не наследуется) может быть нешаблоннымclass Derived123 : public Derived1T<Derived123>
{
int m_x;
double m_y;
string m_z;
public:
int the_hash(int seed) const
{
seed = Derived1T<Derived123>::the_hash(seed); // вызываем предка
seed = hash(seed,m_x); // и досчитываем хэш своих данных
seed = hash(seed,m_y);
seed = hash(seed,m_z);
return seed;
}
};