Автор Тема: Подклас (C++/Qt4)  (Прочетена 1589 пъти)

LinuxFanUNIX

  • Напреднали
  • *****
  • Публикации: 408
  • Distribution: Slackware 12.2
  • Window Manager: KDE 3.5.10
    • Профил
Подклас (C++/Qt4)
« -: Apr 16, 2012, 17:49 »
Имам следният клас:

Код
GeSHi (C++):
  1. class drive
  2. {
  3.  
  4. public:
  5.    int getHarddriveFreeSpace(QString drive);
  6. }

Бихте ли ми казали, как към него да добавя подклас, така че да го викам по следният начин:
drive::getHarddriveFreeSpace("/dev/sdb1").toMb();

До момента съм опитал:
Код
GeSHi (C++):
  1. class space : public drive
  2. {
  3. public:
  4.  
  5.    int toMB();
  6.  
  7. };
но пък по този начин няма как да предам int стойността към toMb() от getHarddriveFreeSpace...

Та въпросът ми е как може да се направи?

Благодаря предварително!
Активен

shoshon

  • Напреднали
  • *****
  • Публикации: 497
    • Профил
Re: Подклас (C++/Qt4)
« Отговор #1 -: Apr 16, 2012, 18:09 »
Коментара ми е грешен - изтрих го.. Не съм видял че иде реч и за онаследяване. Та грешката е изцяло в теорията за ООП, която не мисля че е реднод а се обяснява тук.
« Последна редакция: Apr 17, 2012, 07:31 от shoshon »
Активен

LinuxFanUNIX

  • Напреднали
  • *****
  • Публикации: 408
  • Distribution: Slackware 12.2
  • Window Manager: KDE 3.5.10
    • Профил
Re: Подклас (C++/Qt4)
« Отговор #2 -: Apr 16, 2012, 18:12 »
Опитах с първото решение, обаче пак се опирам до това как класът space да "поеме" стойността в байтове (int) от drive?
Активен

clovenhoof

  • Напреднали
  • *****
  • Публикации: 534
  • Distribution: Mac OSX 10.9.2
    • Профил
Re: Подклас (C++/Qt4)
« Отговор #3 -: Apr 16, 2012, 20:27 »
За да наследиш space от drive, space трябва да може да се държи като drive, но също така и да прави нещо повече в този контекст.
Това обаче не е така. Следователно, не може да осъществиш такова наследяване.
Прочети малко за ООП.

Може да създадеш самостоятелен клас space (отделен или вложен в drive) и да ползваш негова инстанция в drive.
Активен

We are just a moment in time
A blink of an eye
A dream for the blind
Visions from a dying brain

remotex

  • Напреднали
  • *****
  • Публикации: 344
    • Профил
Re: Подклас (C++/Qt4)
« Отговор #4 -: 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)
« Последна редакция: Apr 17, 2012, 04:23 от remotex »
Активен

LinuxFanUNIX

  • Напреднали
  • *****
  • Публикации: 408
  • Distribution: Slackware 12.2
  • Window Manager: KDE 3.5.10
    • Профил
Re: Подклас (C++/Qt4)
« Отговор #5 -: Apr 22, 2012, 02:04 »
Тъй като в конкретния случай използвам външни библиотеки и не е нужно всяка една функция toMB(), toGB() да ги извиква и обработва върнатите резултати, затова ми трябва гореспоменатия начин - имам сумата в байтове, а отделните подфункции ще пресмятат * / : 1024.
Активен

bvbfan

  • Напреднали
  • *****
  • Публикации: 1056
  • Distribution: KaOS
  • Window Manager: Plasma 5
    • Профил
Re: Подклас (C++/Qt4)
« Отговор #6 -: Apr 22, 2012, 10:21 »
Аз съм съгласен с по-горните мнения и така трябва да се прави. Но, ще дам пример и за твоето желание.
Код
GeSHi (C++):
  1. drive::getHarddriveFreeSpace("/dev/sdb1").toMb();
1. Методът getHarddriveFreeSpace трябва да бъде static, за да го извикаш по този начин.
2. За да може след това да достигнеш друг метод, трябва getHarddriveFreeSpace да връща не int, а class, който има метод toMb и така се получава следното:
Код
GeSHi (C++):
  1. class space {
  2.   long SpaceInBytes;  // <- това е размера
  3. public:
  4.   space(long SIB) : SpaceInBytes(SIB) {}
  5.   int toMb(); // SpaceInBytes/1024 ^ 2
  6.   int toKb(); // SpaceInBytes/1024
  7.   int toGb(); // SpaceInBytes/1024 ^ 3
  8. };
  9.  
  10. class drive {
  11. public:
  12.  static space getHarddriveFreeSpace(QString drive)
  13.  {
  14.       return space(/* нещо си long */);
  15.  }
  16. };
  17. // ... където ще го ползваш
  18. int Disk1Mb = drive::getHarddriveFreeSpace("/dev/sdb1").toMb();
  19.  
« Последна редакция: Apr 22, 2012, 10:31 от bvbfan »
Активен