C++ design problem
28 отговора
1110 прегледа
C++ design problem
/*
Interesno mi e kak bihte komentirali sledniq dizain:
*/
class A {
public:
virtual int *getMagicNumber() = 0;
};
class B: public A {
public:
virtual int *getMagicNumber() {
return new int(1 + 1);
}
};
/*
Toi ima ocheviden problem - koi shte osvobodi zaetatta pamet? Zashto tova triabva da e klienta?
Chudia se kak bi mogyl da se reshi tozi problem - varianta da se vryshta by value ne stava, int* moje
da se smeni s LargeObject*.
*/
Interesno mi e kak bihte komentirali sledniq dizain:
*/
class A {
public:
virtual int *getMagicNumber() = 0;
};
class B: public A {
public:
virtual int *getMagicNumber() {
return new int(1 + 1);
}
};
/*
Toi ima ocheviden problem - koi shte osvobodi zaetatta pamet? Zashto tova triabva da e klienta?
Chudia se kak bi mogyl da se reshi tozi problem - varianta da se vryshta by value ne stava, int* moje
da se smeni s LargeObject*.
*/
Re: C++ design problem
Идиомът е MagicNumber-а да е собственост на B - инициализираш в конструктора, чистиш в деструктора, методите ти връщат reference към него(ако няма наложителна причина да е пойнтер). Освен това е задължително деструкторът на A да е virtual.
Re: C++ design problem
Сори за латиницата.
Виж обаче следния код. Твоята идея няма да работи, защото вече имаме различни неща които се произвеждат от този клас.
class AbstractWriter {
public:
virtual void writeStuff()=0;
virtual ~AbstractWriter()=0;
};
AbstractWriter::~AbstractWriter() { }
class ConcreteWriter: public AbstractWriter {
public:
string msg;
ConcreteWriter(string msg): msg(msg) {}
virtual void writeStuff() {
cout << "Hey " << msg << endl;
}
virtual ~ConcreteWriter() {}
};
class A {
public:
virtual AbstractWriter *getWriter(string msg) = 0;
virtual ~A()=0;
};
A::~A() { }
class B: public A {
public:
virtual AbstractWriter *getWriter(string msg) {
return new ConcreteWriter(msg);
}
};
int main() {
A *a = new B;
AbstractWriter *ar0 = a->getWriter("tra");
AbstractWriter *ar1 = a->getWriter("la");
ar0->writeStuff();
ar1->writeStuff();
return 0;
}
Виж обаче следния код. Твоята идея няма да работи, защото вече имаме различни неща които се произвеждат от този клас.
class AbstractWriter {
public:
virtual void writeStuff()=0;
virtual ~AbstractWriter()=0;
};
AbstractWriter::~AbstractWriter() { }
class ConcreteWriter: public AbstractWriter {
public:
string msg;
ConcreteWriter(string msg): msg(msg) {}
virtual void writeStuff() {
cout << "Hey " << msg << endl;
}
virtual ~ConcreteWriter() {}
};
class A {
public:
virtual AbstractWriter *getWriter(string msg) = 0;
virtual ~A()=0;
};
A::~A() { }
class B: public A {
public:
virtual AbstractWriter *getWriter(string msg) {
return new ConcreteWriter(msg);
}
};
int main() {
A *a = new B;
AbstractWriter *ar0 = a->getWriter("tra");
AbstractWriter *ar1 = a->getWriter("la");
ar0->writeStuff();
ar1->writeStuff();
return 0;
}
Re: C++ design problem
Бе аз съм малко прост кодер и не разбирам от 'C++ design', ма като така и така реши да пропишеш на български ще се намеся.
Я разясни малко по-подробно проблема, щото така поставен ми изглежда прекалено елементарен за поставяне, а това обикновено означава, че не съм го разбрал.
Начи не мога да разбера къв е проблема тоя нумбер да е член на B и да му даваш адреса просто?!? Даже ако е един за клас мое и статик да е.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Я разясни малко по-подробно проблема, щото така поставен ми изглежда прекалено елементарен за поставяне, а това обикновено означава, че не съм го разбрал.
Начи не мога да разбера къв е проблема тоя нумбер да е член на B и да му даваш адреса просто?!? Даже ако е един за клас мое и статик да е.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Re: C++ design problem
Бях почнал да отговарям че подобен код не може да се коментира, когато видях че си дал пояснение
Това си е factory което произвежда обекти (а не int[1+1])
Просто ползвай smart pointer-и за да си сигурен че обекта ConcreteWriter се освобождава коректно когато трябва. Това според мене е дестатъчно.
Това си е factory което произвежда обекти (а не int[1+1])
Просто ползвай smart pointer-и за да си сигурен че обекта ConcreteWriter се освобождава коректно когато трябва. Това според мене е дестатъчно.
Re: C++ design problem
ami taka kato gledam moje razlichnite rezultati ot getWriter da
si gi pylnish w edin vector i w destructura na B da si gi delete-wash.
po princip ideiata e che koito prawi new e dobre da prawi delete, nali...
che lesno se proslediawa... moje bi e dobre da wryshtash reference?
si gi pylnish w edin vector i w destructura na B da si gi delete-wash.
po princip ideiata e che koito prawi new e dobre da prawi delete, nali...
che lesno se proslediawa... moje bi e dobre da wryshtash reference?
Re: C++ design problem
В случая и с auto_ptr<> ще се размине ... освен ако не е премълчал и още нещо.
Re: C++ design problem
Това че който прави new трябва да прави delete не е съвсем точно.
Всъщност ако приложението е single threaded може да се ползва map и по ключ да се връща готов обект само ако няма такъв да се създава нов. Това ще намали фрагментацията на паметта, а и скоростта ще е по-добра. За multy threaded е малко по-сложно, но не е невъзможно да се направи.
Всъщност ако приложението е single threaded може да се ползва map и по ключ да се връща готов обект само ако няма такъв да се създава нов. Това ще намали фрагментацията на паметта, а и скоростта ще е по-добра. За multy threaded е малко по-сложно, но не е невъзможно да се направи.
Re: C++ design problem
Относно идеята за вектор или мап, ясно че и така може, но не е много хубаво - представи си, че функцията се вика 1,000,000 пъти.
Re: C++ design problem
Още по-добре.
С map ще спечелиш много ако се вика 1000000 пъти, а имаш само 10 различни по тип обекта. Защото map-a ще ти е 10 елемента.
С map ще спечелиш много ако се вика 1000000 пъти, а имаш само 10 различни по тип обекта. Защото map-a ще ти е 10 елемента.
Re: C++ design problem
Така да е, но може да имаш 1,000,000 различни по тип обекта, не 10, както и да е, мап-а и вектор-а са сравнително окей - въпроса е че когато някои който ще ползва този клас види нещо от рода на
AbstractWriter *getWriter(),
той най-вероятно ще вземе да се чуди - а ся аз ли трябва да изтрия тва дето ще се върне !?
Смарт пойнтерите сега ще ги видя, обаче представи си че този който ползва това нещо не знае какво е това смарт пойнтер.
AbstractWriter *getWriter(),
той най-вероятно ще вземе да се чуди - а ся аз ли трябва да изтрия тва дето ще се върне !?
Смарт пойнтерите сега ще ги видя, обаче представи си че този който ползва това нещо не знае какво е това смарт пойнтер.
Re: C++ design problem
smart pointerДобре. Първо прегледай това за smart pointers. И ще видиш че този който ги ползва няма нужда да знае какво е това, за да го ползва. Това за него е като че ли функцията връща обект от тип AbstractWriter. Като такъв той би трябвало да се унищожи след излизане от обласста на видимост. Така че няма никакво объркване. А самия map също работи отлично с тях.
Малко вероятно е за 1000000 извиквания да са ти нужни 1000000 различни видове writer-и.
Малко вероятно е за 1000000 извиквания да са ти нужни 1000000 различни видове writer-и.
Re: C++ design problem
Да препоръчам и аз един смарт пойнтър -- boost::shared_ptr. Навремето като го ползвах беше много лесен за работа и ми спаси гъза. Особено когато сменяш COM "умен" интерфейсен указател с указател към твой обект.
Re: C++ design problem
ми ако ме питаш - кръсти го createWriter() и тоя дето го ползва ще се чуди по-малко 
Сигнатура!
Сигнатура!
Re: C++ design problem
>>кръсти го createWriter()
Мнеее... това е прекалено лесно. По Джавешкия начин... първо си правиш WriterFactory class и после от него правиш... каквото правиш.
Фабрики трябва да имаш - това Ъпсурт са го казали. Нали във фабриките трябва да работят на поточните линии няколко хиляди Люлянджии и Обельовци докато шефчето заработва коледния си бонус - кристален сервиз от Сваровски.
--
Sometimes the sole purpose of your life is to serve as a warning to others.
Мнеее... това е прекалено лесно. По Джавешкия начин... първо си правиш WriterFactory class и после от него правиш... каквото правиш.
Фабрики трябва да имаш - това Ъпсурт са го казали. Нали във фабриките трябва да работят на поточните линии няколко хиляди Люлянджии и Обельовци докато шефчето заработва коледния си бонус - кристален сервиз от Сваровски.
--
Sometimes the sole purpose of your life is to serve as a warning to others.
Re: C++ design problem
> Да препоръчам и аз един смарт пойнтър -- boost::shared_ptr. Навремето
> като го ползвах беше много лесен за работа и ми спаси гъза. Особено
> когато сменяш COM "умен" интерфейсен указател с указател към твой обект.
Ъхъ, а освен това е Made in Bulgaria
> като го ползвах беше много лесен за работа и ми спаси гъза. Особено
> когато сменяш COM "умен" интерфейсен указател с указател към твой обект.
Ъхъ, а освен това е Made in Bulgaria
Re: C++ design problem
Много съм прост явно, защото не намирам връзка между фактори и Java.
Почти сигурен съм че в .net няма нужда от такива, защото има написан framework за това нали?
Факторитата се появиха в C++ преди още Java-та да я имаше.
Почти сигурен съм че в .net няма нужда от такива, защото има написан framework за това нали?
Факторитата се появиха в C++ преди още Java-та да я имаше.