C++ design problem

28 отговора 1110 прегледа
#1

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*.
*/

Отговор
в отговор на z-order #2

Re: C++ design problem

Идиомът е MagicNumber-а да е собственост на B - инициализираш в конструктора, чистиш в деструктора, методите ти връщат reference към него(ако няма наложителна причина да е пойнтер). Освен това е задължително деструкторът на A да е virtual.

Отговор
в отговор на Paдo #3

Re: C++ design problem

Абе забравих да те питам - 'що не пишеш на кирилица?

Отговор
в отговор на Paдo #4

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;
}

Отговор
в отговор на z-order #5

Re: C++ design problem

Бе аз съм малко прост кодер и не разбирам от 'C++ design', ма като така и така реши да пропишеш на български ще се намеся.

Я разясни малко по-подробно проблема, щото така поставен ми изглежда прекалено елементарен за поставяне, а това обикновено означава, че не съм го разбрал.

Начи не мога да разбера къв е проблема тоя нумбер да е член на B и да му даваш адреса просто?!? Даже ако е един за клас мое и статик да е.

System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Отговор
в отговор на z-order #6

Re: C++ design problem

Бях почнал да отговарям че подобен код не може да се коментира, когато видях че си дал пояснение
Това си е factory което произвежда обекти (а не int[1+1])
Просто ползвай smart pointer-и за да си сигурен че обекта ConcreteWriter се освобождава коректно когато трябва. Това според мене е дестатъчно.

Отговор
в отговор на z-order #7

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?

Отговор
в отговор на qwerty #8

Re: C++ design problem

В случая и с auto_ptr<> ще се размине ... освен ако не е премълчал и още нещо.

Отговор
в отговор на mx #9

Re: C++ design problem

Това че който прави new трябва да прави delete не е съвсем точно.
Всъщност ако приложението е single threaded може да се ползва map и по ключ да се връща готов обект само ако няма такъв да се създава нов. Това ще намали фрагментацията на паметта, а и скоростта ще е по-добра. За multy threaded е малко по-сложно, но не е невъзможно да се направи.

Отговор
в отговор на qwerty #10

Re: C++ design problem

Какъв точно smart pointer ?

Отговор
в отговор на z-order #11

Re: C++ design problem

Нещо такова:
[линк]

Отговор
в отговор на mx #12

Re: C++ design problem

Относно идеята за вектор или мап, ясно че и така може, но не е много хубаво - представи си, че функцията се вика 1,000,000 пъти.

Отговор
в отговор на z-order #13

Re: C++ design problem

Още по-добре.
С map ще спечелиш много ако се вика 1000000 пъти, а имаш само 10 различни по тип обекта. Защото map-a ще ти е 10 елемента.

Отговор
в отговор на qwerty #14

Re: C++ design problem

Така да е, но може да имаш 1,000,000 различни по тип обекта, не 10, както и да е, мап-а и вектор-а са сравнително окей - въпроса е че когато някои който ще ползва този клас види нещо от рода на

AbstractWriter *getWriter(),

той най-вероятно ще вземе да се чуди - а ся аз ли трябва да изтрия тва дето ще се върне !?

Смарт пойнтерите сега ще ги видя, обаче представи си че този който ползва това нещо не знае какво е това смарт пойнтер.

Отговор
в отговор на z-order #15

Re: C++ design problem

smart pointerДобре. Първо прегледай това за smart pointers. И ще видиш че този който ги ползва няма нужда да знае какво е това, за да го ползва. Това за него е като че ли функцията връща обект от тип AbstractWriter. Като такъв той би трябвало да се унищожи след излизане от обласста на видимост. Така че няма никакво объркване. А самия map също работи отлично с тях.
Малко вероятно е за 1000000 извиквания да са ти нужни 1000000 различни видове writer-и.

Отговор
в отговор на qwerty #16

Re: C++ design problem

Да препоръчам и аз един смарт пойнтър -- boost::shared_ptr. Навремето като го ползвах беше много лесен за работа и ми спаси гъза. Особено когато сменяш COM "умен" интерфейсен указател с указател към твой обект.

Отговор
в отговор на z-order #17

Re: C++ design problem

ми ако ме питаш - кръсти го createWriter() и тоя дето го ползва ще се чуди по-малко

Сигнатура!
Отговор
в отговор на Questor #18

Re: C++ design problem

>>кръсти го createWriter()

Мнеее... това е прекалено лесно. По Джавешкия начин... първо си правиш WriterFactory class и после от него правиш... каквото правиш.

Фабрики трябва да имаш - това Ъпсурт са го казали. Нали във фабриките трябва да работят на поточните линии няколко хиляди Люлянджии и Обельовци докато шефчето заработва коледния си бонус - кристален сервиз от Сваровски.

--
Sometimes the sole purpose of your life is to serve as a warning to others.
Отговор
в отговор на Дeшeв #19

Re: C++ design problem

> Да препоръчам и аз един смарт пойнтър -- boost::shared_ptr. Навремето
> като го ползвах беше много лесен за работа и ми спаси гъза. Особено
> когато сменяш COM "умен" интерфейсен указател с указател към твой обект.

Ъхъ, а освен това е Made in Bulgaria

Отговор
в отговор на Гypy #20

Re: C++ design problem

Много съм прост явно, защото не намирам връзка между фактори и Java.
Почти сигурен съм че в .net няма нужда от такива, защото има написан framework за това нали?
Факторитата се появиха в C++ преди още Java-та да я имаше.

Отговор