Деректерді көшірмей-ақ жергілікті объектіні көрсеткішке түрлендіріңіз?

Менде cnList класы бар, ол элементтердің икемді санын сақтайды. Бұл тізім кейінірек cnArray нысанына түрлендірілуі керек. Тізім класы қазірдің өзінде cnArray cnList :: toArray() const әдісін іске асырады.

Бірақ көріп тұрғаныңыздай, ол сілтеме немесе көрсеткіш емес, нысанды қайтарады. Бірақ тізімді массивке айналдырғаннан кейін не істеуім керек, бұл массаны сынып мүшесінен кейін пайдалану үшін сақтау керек, яғни бұл cnArray нысанына көрсеткіш керек.

Енді, нақты мәселе - жай ғана массивтерді қолдану арқылы опция емес, себебі ол қазіргі кездегі әдісден кейін босатылады, аяқталады.

Мен бұл нысанды көрсеткішке «түрлендіре» аламын ба? Әрине, мен барлық жазбаларды объект-массивтен нүктелі-массивге көшіруге болатын еді, бірақ ол маған қажет емес, бұл өте тиімді емес.

cnArray нысанына көрсеткішті қайтаратын cnList әдісін қолдануға болатынын білемін, бірақ бұл туралы бар ма екенін білгім келеді.

3
@Jimmy неге бұл керек? Және бұл тақырыпқа байланысты?
қосылды автор Niklas R, көзі
@BenjaminLindley Кешіріңіз, қандай әдіс құндылығы бойынша қайтаруға тиіс?
қосылды автор Niklas R, көзі
Сіз cnArray-те семантиканы қозғалтыңыз ба? Неге тек қана құндылығы бар?
қосылды автор Benjamin Lindley, көзі
cnList кез-келген анықтамалық есепті жасайтынын тексердіңіз бе?
қосылды автор Jimmy, көзі

4 жауаптар

toArray мәнінің қайтарылған мәнінен салынған жаңадан cnArray-ты бөлуге болады. Егер сіз мұны дұрыс жасасаңыз, Қайтарылған мәнді оңтайландыру компиляторға артық көшірмені оңтайландыруға мүмкіндік береді:

cnArray *p = new cnArray(list.toArray());

To see that g++'s RVO will eliminate the copy, see http://ideone.com/loXAT

4
қосылды
Мәссаған. Шындығында бұл қарапайым және анық, рахмет. Жақсы жұмыс істейді!
қосылды автор Niklas R, көзі

Көрсеткіштер қалаулы адамдар сияқты пайдаланылуы мүмкін. Мәселе автоматты түрде үйме нысанын пайдаланатын үйіндіге бөлінген нысанды автоматты түрде түрлендірмейді. Мен, егер мүмкін болса, shared_ptr пайдалануға кеңес берер едім.

cnArray* Ptr = new cnArray();
(*Ptr) = cnList::toArray();
0
қосылды
Бұл кодты пайдалану белгісіз нәтижелер береді. Сақталған деректер жойылады. Жазуды қайтару cnList :: toArray() көрсеткішті қайтару үшін жұмыс істейді, сондықтан бұл менің басқа кодым емес.
қосылды автор Niklas R, көзі

CnList жаңа cnArray-ге көшірілген болып табылады. cnArray :: ToList функциясы қолданыстағы cnArray сілтемесін немесе меңзерді қабылдау үшін жазылған болуы мүмкін, бірақ олай болмады. Егер Сіз интерфейсті өзгерте алсаңыз, оны қарастырыңыз.

Қайтарылған cnArray - жергілікті нысан, ол ауқымнан шыққан кезде жойылады және сіз оны түсінесіз. Жалғыз таңдауыңыз - оның басқа көшірмесін сіздің нысанның мүше айнымалы мәніне айналдыру.

Кейбір C ++ компиляторлары артық көшірменің жасалуын болдырмайтын көшірмелеу элесін жасайды. Қайтарылатын мәнді уақытша беруге тағайындаудың орнына, оны тікелей мүшеге айналдырыңыз.

0
қосылды

cnList :: toArray() ішінде сіз cnArray * obj динамикалық түрде бөле аласыз, cnList нысаныңызды obj содан кейін obj параметрін қайтарыңыз. Өңделмеген (немесе ақылды) көрсеткішті артқа айналдырғандықтан, ол ауқымнан тыс болғанда бөлінбейді.

0
қосылды
Сіз, менің ойымша, бұл объектінің орнына көрсеткішті қайтаратын әдісті іске асыруды көздеймін. Бұл шын мәнінде өте жақсы жұмыс істейді, менің ойымша, мен бармын. Тек қана үйді бөлуге тыйым сала алмас едім.
қосылды автор Niklas R, көзі