Private Copy Constructor - причини за използване?
11 отговора
457 прегледа
Private Copy Constructor - причини за използване?
Лирическо отклонение:
Въображението ми бе "погъделичкано" от предишния постинг на ловеца на глави ... или риби. Замислих се за приложението на private copy constructor-ите и private операторите за присвояване (operator= - по думите на Architect-a).
Наистина такова животно има. Използва се рядко, но ...
Architect-a отговори на въпроса защo се използват. Но има и друг.
Въпросът е:
Знае ли някой причините, поради които някой програмист-чудак, би използвал private copy constructor и private operator=(..) в описанието на класа си?
ПищоФФ:
Няма да ви помогнат нито математиката, ното алгоритмите, нито циклите ... Използвайте само въображението си!
P.S. Отговорът няма да ви донесе нито пари, нито слава.
Въображението ми бе "погъделичкано" от предишния постинг на ловеца на глави ... или риби. Замислих се за приложението на private copy constructor-ите и private операторите за присвояване (operator= - по думите на Architect-a).
Наистина такова животно има. Използва се рядко, но ...
Architect-a отговори на въпроса защo се използват. Но има и друг.
Въпросът е:
Знае ли някой причините, поради които някой програмист-чудак, би използвал private copy constructor и private operator=(..) в описанието на класа си?
ПищоФФ:
Няма да ви помогнат нито математиката, ното алгоритмите, нито циклите ... Използвайте само въображението си!
P.S. Отговорът няма да ви донесе нито пари, нито слава.
Re: Private Copy Constructor - причини за използване?
Няма ниакаво въобръйение тука. За да си сигурен, че обектите ще ти се създават от точно едно място (например някакво Factory) ще ги използваш. съзщо за да си сигурен че обектите ти няма да се копират в стека пак ще ги използваш. За да си сигурен че ще се използват само методи, пак ще ги използваш (например нещо като clone()). Има много интересни приложения!

Re: Private Copy Constructor - причини за използване?
Mnogo prosto - za da zabranish prisvoyavaneto izobshto. Shtoto ako vyobshte ne definirash copy constructor i operator=, kompilatoryt slaga default takiva, koito sa public.
Re: Private Copy Constructor - причини за използване?
>>> съзщо за да си сигурен че обектите ти няма да се копират в стека пак ще ги използваш.
Zashto taka shte si siguren che obektite nama da se kopirat v steka ? Tuka neshto ne mu se vryzva... :-)
Zaradi Factory - da, ama...
Zashto taka shte si siguren che obektite nama da se kopirat v steka ? Tuka neshto ne mu se vryzva... :-)
Zaradi Factory - da, ama...
Re: Private Copy Constructor - причини за използва
... и използването на които, понякога би довело до изключителни бози ...
Правилно!
Правилно!
Ето ти смислен пример...
Темата стана банална! Примера ти показва, смислено приложение на protected copy constructor. Обектите не могат явно да се предават през стека.
Изобщо, след като нещо може да се компилира, то може да немери и някъкъв смисъл. Друг е въпроса, дали това е най-добрият варянт.
class A
{
private:
int x;
private:
A(const A &_a) : x(_a.x) {}
public:
A() : x(0) {}
~A() {}
public:
int get_x() const
{
return x;
}
A clone()
{
return A(*this);
}
};
void test_alias(A & _a)
{
_a.get_x();
}
void test_stack(A _a)
{
_a.get_x();
}
int main(int, char**)
{
A a, b;
a = b; // ok
test_alias(a); // ok
test_stack(a); // failed (A::A(const A&) is not accessible)
test_stack(a.clone()); // ok
}

Изобщо, след като нещо може да се компилира, то може да немери и някъкъв смисъл. Друг е въпроса, дали това е най-добрият варянт.
class A
{
private:
int x;
private:
A(const A &_a) : x(_a.x) {}
public:
A() : x(0) {}
~A() {}
public:
int get_x() const
{
return x;
}
A clone()
{
return A(*this);
}
};
void test_alias(A & _a)
{
_a.get_x();
}
void test_stack(A _a)
{
_a.get_x();
}
int main(int, char**)
{
A a, b;
a = b; // ok
test_alias(a); // ok
test_stack(a); // failed (A::A(const A&) is not accessible)
test_stack(a.clone()); // ok
}
Re: Private Copy Constructor - причини за използване?
Ами може да ма много прични. Едната е че обекта ти е много голям и не искасх да се копира в стека. Ще използваш указатели или псевдоними. Другия е че обекта ти е прекалено комплексен и реализацията на Copy Contructor би би усложниала логиката на програмата. В общи линии за това се сещам сега. А и от извесно време си мисля че използването на псевдоними при предаване на праметри на методите е много пъти по добре от копиране в стека. А и много по бързо.

Re: Ето ти смислен пример...
Явно не сте ме разбрали ...
Става дума не за protected, a за private copy constructor ... и още нещо, без което той е безсмислен ...
Е, Благодаря за примера!
Става дума не за protected, a за private copy constructor ... и още нещо, без което той е безсмислен ...
Е, Благодаря за примера!
Оппс...
В уводните редове съм написал "protected copy constructor", но съм имал предвид "private". Грешката е моя
. В сорса по-надолу си е "private"

Re: Оппс...
Добре ... Изморих се ...
Истинският смисъл на private copy constructor-ът, се проявява истински когато той е блокиращ и се използва заедно с AClass& operator=( const AClass& ) ... Иначе определено е БЕЗСМИСЛЕН ...
Истинският смисъл на private copy constructor-ът, се проявява истински когато той е блокиращ и се използва заедно с AClass& operator=( const AClass& ) ... Иначе определено е БЕЗСМИСЛЕН ...
Re: Оппс...
Eeeee, nai-posle... :-)))
Inache za predavaneto na parametri vinagi e hubavo da se predava reference kym methodite, inache kak..., razbira se che shte e mnogo po-bavno ako kopirash neshto v steka, koeto tepyrva shte syzdavash.... V Java vsichko e "By Reference", za da ne stavat greshki, inache v C++ nqkoi vse go propuskat toq znak "&" :-)))
Inache za predavaneto na parametri vinagi e hubavo da se predava reference kym methodite, inache kak..., razbira se che shte e mnogo po-bavno ako kopirash neshto v steka, koeto tepyrva shte syzdavash.... V Java vsichko e "By Reference", za da ne stavat greshki, inache v C++ nqkoi vse go propuskat toq znak "&" :-)))
Re: Private Copy Constructor - причини за използване?
>>Знае ли някой причините, поради които някой програмист-чудак, би използвал private
>>copy constructor и private operator=(..) в описанието на класа си?
Za nqkoi klasove, napr. UI prozorec, proces, mutex, operaciite kopirane i prisvoqvane prosto nqmat fizicheski ili utilitaren smisal, a default realizaciqta na copy constructora i operator = bi nanesla osobeni shteti ;)
>>copy constructor и private operator=(..) в описанието на класа си?
Za nqkoi klasove, napr. UI prozorec, proces, mutex, operaciite kopirane i prisvoqvane prosto nqmat fizicheski ili utilitaren smisal, a default realizaciqta na copy constructora i operator = bi nanesla osobeni shteti ;)