Титла: Подклас (C++/Qt4) Публикувано от: LinuxFanUNIX в Apr 16, 2012, 17:49 Имам следният клас:
Код
Бихте ли ми казали, как към него да добавя подклас, така че да го викам по следният начин: drive::getHarddriveFreeSpace("/dev/sdb1").toMb(); До момента съм опитал: Код но пък по този начин няма как да предам int стойността към toMb() от getHarddriveFreeSpace... Та въпросът ми е как може да се направи? Благодаря предварително! Титла: Re: Подклас (C++/Qt4) Публикувано от: shoshon в Apr 16, 2012, 18:09 Коментара ми е грешен - изтрих го.. Не съм видял че иде реч и за онаследяване. Та грешката е изцяло в теорията за ООП, която не мисля че е реднод а се обяснява тук.
Титла: Re: Подклас (C++/Qt4) Публикувано от: LinuxFanUNIX в Apr 16, 2012, 18:12 Опитах с първото решение, обаче пак се опирам до това как класът space да "поеме" стойността в байтове (int) от drive?
Титла: Re: Подклас (C++/Qt4) Публикувано от: clovenhoof в Apr 16, 2012, 20:27 За да наследиш space от drive, space трябва да може да се държи като drive, но също така и да прави нещо повече в този контекст.
Това обаче не е така. Следователно, не може да осъществиш такова наследяване. Прочети малко за ООП. Може да създадеш самостоятелен клас space (отделен или вложен в drive) и да ползваш негова инстанция в drive. Титла: Re: Подклас (C++/Qt4) Публикувано от: remotex в Apr 17, 2012, 04:21 Обяснявай по-внимателно колега.
1. Какво общо има Qt в случая - освен един параметър който спокойно може и да е std::string вместо QString ? Питам защото предполагам какъв е проблема, но не обичам да гадая. 2. За какво ти е точно по този начин? drive::getHarddriveFreeSpace("/dev/sdb1").toMb(); Така както си дал примера е крайно неподходящ... обяснението също Това което искаш (да връща свободното място в Мб) може да се направи по няколко начина: 1) Съдейки по примера предполагам класът си е твой а не от Qt. class drive{ public: int getHarddriveFreeSpace(QString drive); int getHarddriveFreeSpaceInMb(QString drive); } 2) Ако не е твой и не можеш да го променяш - както е доста често в случаите с Qt: имаш базов клас който трябва да наследиш и промениш малко, но за да може да работи Qt средата с него ще трябва да е през указател към базовия. За да ти мине номера в този сл. трябва методът да е виртуален в базовия т.е. и във всички наследници, но дори и тогава няма да стане както искаш а ще трябва да се извиква с напр. int i =derived_drive.getHarddriveFreeSpace("C:"); т.е. не можеш да промениш интерфейса му в базовия клас да връща обект ами ще си връща int и това е, а на int не можеш да му викаш метод toMb() ;D 3) Това което искате drive::getHarddriveFreeSpace("/dev/sdb1").toMb(); може да се направи с 3 или 2 класа според зависи дали можете да променяте изходния class drive Трябва Ви само още един статичен метод със същата сигнатура getHarddriveFreeSpace("/dev/sdb1") във drive или derive_drive но с различен тип връщана ст-т който си дефинирате сам напр. class octets с метод int toMb(); и тогава сме най-близко до това което искате съответно извикването ще е drive::getHarddriveFreeSpace("/dev/sdb1").toMb(); derived_drive::getHarddriveFreeSpace("/dev/sdb1").toMb(); което всъщност е съкратен запис на: octets o = derived_drive::getHarddriveFreeSpace("/dev/sdb1"); o.toMb(); на който не знам защо толкова много държиш да е с един derived клас па той с единия метод статичен па другия не, аз лично бих ползвал 1) Титла: Re: Подклас (C++/Qt4) Публикувано от: LinuxFanUNIX в Apr 22, 2012, 02:04 Тъй като в конкретния случай използвам външни библиотеки и не е нужно всяка една функция toMB(), toGB() да ги извиква и обработва върнатите резултати, затова ми трябва гореспоменатия начин - имам сумата в байтове, а отделните подфункции ще пресмятат * / : 1024.
Титла: Re: Подклас (C++/Qt4) Публикувано от: bvbfan в Apr 22, 2012, 10:21 Аз съм съгласен с по-горните мнения и така трябва да се прави. Но, ще дам пример и за твоето желание.
Код 1. Методът getHarddriveFreeSpace трябва да бъде static, за да го извикаш по този начин. 2. За да може след това да достигнеш друг метод, трябва getHarddriveFreeSpace да връща не int, а class, който има метод toMb и така се получава следното: Код
|