Установка перегрузки конструктора класса INSIDE еще одна перегрузка того же класса - PullRequest
0 голосов
/ 12 мая 2011

Эй, я работаю над классом секундомера, используя окна GetTickCount () и STL, но столкнулся с проблемой, заключающейся в реализации конструктора Stopwatch (int DecNumb) в перегрузке Stopwatch (int DecNumb, char command []) тип данных «точность» не установлен правильно в последнем конструкторе.

(похоже, оно возвращает прежнее значение unsigned long int 560345 или что-то в этом роде ...)

Вот команды class и main (), которые я использую для его проверки:

class Stopwatch
    {
    protected:
        int               accuracy;
        unsigned long int initial_ilu;
        unsigned long int current_ilu;
        long float        output_fl;
       vector<long float> times;

    public:
        Stopwatch(int DecNumb) { // so accuracy*10 isn't 0
                                    accuracy = 1;
                                for(;DecNumb>0;DecNumb--) // the Tick count will
                                accuracy = accuracy*10;}; // diveded by accuracy (each 0 in this number moves the decimal over once)
        Stopwatch(int aDecNumb, char command[]) {Stopwatch::Stopwatch(aDecNumb);
                                                 if(command = "start") Stopwatch::Start();}; 
        void Start(){initial_ilu = GetTickCount()/*/accuracy*/;};
        long float ElapsedTime()
        {
            current_ilu = GetTickCount()/*/accuracy*/;
            output_fl =  (current_ilu - initial_ilu)/accuracy;
            return output_fl;
        };
        void Wait(long float seconds) 
        {
            for(unsigned long int waitTime = GetTickCount() + (seconds*accuracy);
                waitTime > GetTickCount();) {}
            // stay stuck in for loop until time specified is up
        };

        void SaveTime(){times.push_back(GetTickCount()/*/accuracy*/);};
        long float GetTime(int location){if(times.size()<location+1) return times[location+1];
                                         else return -1;};

    };

А вот main ()

int main()
    {
        Stopwatch myStopwatch(3,"start");
        for(;;)
        {
            myStopwatch.Wait(2);
            cout << myStopwatch.ElapsedTime() << endl;
        }
                return 0;
    }

Почему точность не остается на значении, которое я тоже установил в конструкторе? Спасибо!=) ох и любые другие отзывы о моем коде приветствуются!(я довольно новый)

Ответы [ 2 ]

5 голосов
/ 12 мая 2011
Stopwatch::Stopwatch(aDecNumb);

Это не вызывает другой конструктор;это даже не допустимо C ++.

Вы не можете вызвать один конструктор из другого конструктора для того же объекта.При создании объекта вызывается только один конструктор (конечно, не включая базовый класс или конструкторы-члены).

Однако вам не нужны два конструктора;одного будет достаточно:

Stopwatch(int DecNumb, char* command = 0) {
    accuracy = 1;
    for(; DecNumb > 0; DecNumb--) {
        accuracy = accuracy * 10;
    }

    if (command && std::string(command) == "start") {
        Start();
    }
}

Если вам действительно нужны два конструктора, лучше всего либо использовать базовый класс, который выполняет инициализацию, общую для нескольких конструкторов, либо использовать функцию-член «initialize», котораяможно вызывать из нескольких конструкторов.

0 голосов
/ 12 мая 2011

Секундомер (int aDecNumb, команда char []) {Stopwatch :: Stopwatch (aDecNumb); if (command = "start") Секундомер :: Start ();};

// Секундомер :: Секундомер (aDecNumb); используется для объявления конструктора вне определения класса, здесь это неправильное использование, оно ничего не делает.

Вы можете построить класс и использовать его как интерфейс / или как дополнение базового класса, производное от него, если вы действительно хотите инициализировать конструкторы.

...