• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wymiana danych między plikami cpp - c++ object

Object Storage Arubacloud
0 głosów
499 wizyt
pytanie zadane 10 maja 2017 w C i C++ przez Eryk Chojnacki Obywatel (1,420 p.)

Tworzę prosty timer w konsoli posługując się obiektowym c++. Chciałem by funkcje z pliku cpp, który rozwija plik .h, miały dostęp do zmiennych zadeklarowanych w tym właśnie pliku .h . Gdy próbowałem użyć wskaźników, kompilator wyrzucał mi błąd o treści:
 

||=== Build: Debug in Nauak (compiler: GNU GCC Compiler) ===|
E:\Programy C++\Nauak\Timer.cpp|6|error: 'hours' was not declared in this scope|
E:\Programy C++\Nauak\Timer.cpp|6|error: 'minutes' was not declared in this scope|
E:\Programy C++\Nauak\Timer.cpp|6|error: 'seconds' was not declared in this scope|
E:\Programy C++\Nauak\Timer.cpp|6|error: expression list treated as compound expression in initializer [-fpermissive]|
E:\Programy C++\Nauak\Timer.cpp|7|error: expected ',' or ';' before '{' token|
||=== Build failed: 5 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

Jak mam uzyskać dostęp do tych zmiennych?

komentarz 10 maja 2017 przez draghan VIP (106,230 p.)
Pokaż te pliki, to coś poradzimy. Inaczej możemy tylko zgadywać.
komentarz 10 maja 2017 przez Eryk Chojnacki Obywatel (1,420 p.)
main.cpp

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <conio.h>
#include "Timer.h"
using namespace std;

int main()
{
    Timer t1;
    Timer::Timer()
    {
        hours=0; minutes=0; seconds=0;
    }
    settime();
    start();
    ~Timer();
    return 0;
}

Timer.h

#include <iostream>
#include <ctime>
#include <cstdlib>
#include "Timer.cpp"
#include <conio.h>
class Timer
{
private:

    int hours * hours, minutes *minutes, seconds *seconds;
    Timer();
public:

    int counting( *hours, *minutes,  *seconds)
    int settime( *hours,  *minutes,  *seconds)
    int start( *hours,  *minutes,  *seconds)
    int pause(*hours,  *minutes,  *seconds)
    int setend( *hours,  *minutes,  *seconds)
};

Timer.cpp

 

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <conio.h>
int counting(*hours, *minutes, (seconds)
{
    bool start_pause=true;
    while(seconds && minutes && hours>0 && start_pause==true)
    {
    start_pause=false;
    while(start_pause==false)
    {
    seconds-1;
    sleep(1000);
        if(seconds==0)
        {
            minutes-1;
        }
        if(minutes==0)
        {
            hours-1;
        }
    }
    }
    friend void start();
    friend void pause();
    friend void timeend();
    return 0;
}

int settime(hours *hours, minutes *minutes, seconds *seconds)
{
    cout<<"Set time to counting: "<<endl;
    cout<<"Hours:"<<endl;
    cin>>hours;
        if(hours<0)
        {
            while(hours<0)
            {
            cout<<"Unable number of seconds. Load number on plus or zero: "<<endl;
            cin>>hours;
            }
        }
    cout<<"Minutes:"<<endl;
    cin>>minutes;
        if(minutes<0 || minutes>60)
        {
            while(minutes<0)
            {
            cout<<"Unable number of minutes. Load number from 0 to 60: "<<endl;
            cin>>minutes;
            }
        }
    cout<<"Seconds:"<<endl;
    cin>>seconds;
    if(seconds<0 || seconds>60)
    {
        while(seconds<0)
        {
            cout<<"Unable number of seconds. Load number from 0 to 60: "<<endl;
            cin>>seconds;
        }
    }
    cout<<"Press enter to start"<<endl;
    friend void timeend();
    return 0;
}

int start(hours *hours, minutes *minutes, seconds *seconds)
{
    if(getch(13)&& start_pause==true)
    {
        counting();
    }
    cout<<"Press enter to stop"<<endl;
    return 0;
}

int pause(hours *hours, minutes *minutes, seconds *seconds)
{
    if(getch(13)&& start_pause==false)
    {
        start_pause=true;
    }
    return 0;
}

int setend(hours *hours, minutes *minutes, seconds *seconds)
{
    if(getch(27))
    {
        hours=0;
        minutes=0;
        seconds=0;
        settime();
    }
    return 0;
}
komentarz 10 maja 2017 przez Eryk Chojnacki Obywatel (1,420 p.)
Tego pierwszego od góry nie ma w kodzie, to błąd wstawienia
komentarz 10 maja 2017 przez Eryk Chojnacki Obywatel (1,420 p.)

I błędy:

||=== Build: Debug in Nauak (compiler: GNU GCC Compiler) ===|
E:\Programy C++\Nauak\Timer.cpp|5|error: 'hours' was not declared in this scope|
E:\Programy C++\Nauak\Timer.cpp|5|error: 'minutes' was not declared in this scope|
E:\Programy C++\Nauak\Timer.cpp|5|error: 'seconds' was not declared in this scope|
E:\Programy C++\Nauak\main.cpp||In function 'int main()':|
E:\Programy C++\Nauak\main.cpp|10|error: 'Timer' was not declared in this scope|
E:\Programy C++\Nauak\main.cpp|11|error: 'Timer' is not a class or namespace|
E:\Programy C++\Nauak\main.cpp|15|error: 'settime' was not declared in this scope|
E:\Programy C++\Nauak\main.cpp|16|error: 'start' was not declared in this scope|
||=== Build failed: 7 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

 

1 odpowiedź

0 głosów
odpowiedź 10 maja 2017 przez draghan VIP (106,230 p.)
wybrane 10 maja 2017 przez Eryk Chojnacki
 
Najlepsza

Może zacznijmy od początku, bo tutaj błędów jest całkiem sporo.

Co ma oznaczać ta linia (Timer.h)?

int hours * hours, minutes *minutes, seconds *seconds;

hours*hours?

komentarz 10 maja 2017 przez Eryk Chojnacki Obywatel (1,420 p.)

To już mam poprawione, tam są wskaźniki:


 int *h, *m, *s;
    h=&hours;
    m=&minutes;
    s=&seconds;

 

komentarz 10 maja 2017 przez draghan VIP (106,230 p.)

Ok, czyli wskaźniki na int. Trochę to dziwne (chyba powinny to być po prostu... inty?), ale niech Ci będzie.

Zrobimy inaczej. Podam Ci prosty przykład, który spróbujesz zaaplikować do swojego programu.

W pliku nagłówkowym deklarujesz sobie klasę:
 

#pragma once

class Foo
{
public:
    Foo(int x);
    ~Foo() = default;
    int get_x() const;
    void set_x(int x);

private:
    int x;
};

W pliku *.cpp definiujesz ciała metod tej klasy. W taki sposób:

#include "Foo.h" // żeby kompilator znał składowe Foo

/* każda nazwa definiowanej metody musi być jawnie poprzedzona nazwą klasy, 
    do której należy. 
    Inaczej napisałbyś po prostu zwykłą funkcję.
 */

Foo::Foo(int x) 
:x{x}
{
}

int Foo::get_x() const
{
    return x;
}

void Foo::set_x(int x)
{
    this->x = x;
}

A w funkcji, w której chcesz użyć obiektu Foo:

#include "Foo.h" // musisz dołączyć nagłówek, żeby kompilator "znał" klasę Foo
#include <iostream>

int main()
{
    Foo bar(2); // zmienna o nazwie bar i typie Foo
    std::cout<<bar.get_x()<<'\n';
    bar.set_x(5);
    std::cout<<bar.get_x()<<'\n';
}

Jeśli nie będzie Ci wychodzić, pisz (tylko nie w nowej odpowiedzi, bo nie dostanę powiadomienia).

komentarz 10 maja 2017 przez Eryk Chojnacki Obywatel (1,420 p.)
edycja 10 maja 2017 przez Eryk Chojnacki
Teraz są błędy w main.cpp:
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <conio.h>
#include "Timer.h"
using namespace std;

int main()
{
    Timer t1;
    Timer::Timer();
    settime();
    start();
    ~Timer();
    return 0;
}

 

||=== Build: Debug in Nauak (compiler: GNU GCC Compiler) ===|
E:\Programy C++\Nauak\main.cpp||In function 'int main()':|
E:\Programy C++\Nauak\main.cpp|11|error: cannot call constructor 'Timer::Timer' directly [-fpermissive]|
E:\Programy C++\Nauak\main.cpp|11|note: for a function-style cast, remove the redundant '::Timer'|
E:\Programy C++\Nauak\main.cpp|12|error: 'settime' was not declared in this scope|
E:\Programy C++\Nauak\main.cpp|13|error: 'start' was not declared in this scope|
E:\Programy C++\Nauak\main.cpp|14|error: no match for 'operator~' (operand type is 'Timer')|
E:\Programy C++\Nauak\main.cpp|14|note: candidates are:|
C:\Program Files (x86)\CodeBlocks\MinGW\lib\gcc\mingw32\4.9.2\include\c++\bits\ios_base.h|87|note: std::_Ios_Fmtflags std::operator~(std::_Ios_Fmtflags)|
C:\Program Files (x86)\CodeBlocks\MinGW\lib\gcc\mingw32\4.9.2\include\c++\bits\ios_base.h|87|note:   no known conversion for argument 1 from 'Timer' to 'std::_Ios_Fmtflags'|
C:\Program Files (x86)\CodeBlocks\MinGW\lib\gcc\mingw32\4.9.2\include\c++\bits\ios_base.h|127|note: std::_Ios_Openmode std::operator~(std::_Ios_Openmode)|
C:\Program Files (x86)\CodeBlocks\MinGW\lib\gcc\mingw32\4.9.2\include\c++\bits\ios_base.h|127|note:   no known conversion for argument 1 from 'Timer' to 'std::_Ios_Openmode'|
C:\Program Files (x86)\CodeBlocks\MinGW\lib\gcc\mingw32\4.9.2\include\c++\bits\ios_base.h|165|note: std::_Ios_Iostate std::operator~(std::_Ios_Iostate)|
C:\Program Files (x86)\CodeBlocks\MinGW\lib\gcc\mingw32\4.9.2\include\c++\bits\ios_base.h|165|note:   no known conversion for argument 1 from 'Timer' to 'std::_Ios_Iostate'|
||=== Build failed: 4 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

 

komentarz 10 maja 2017 przez draghan VIP (106,230 p.)

Nigdy nie wywołuje się konstruktora jawnie. Kiedy piszesz: Timer t1; to konstruktor jest wywoływany automatycznie - z definicji, przy tworzeniu obiektu.

Podobnie z destruktorem - można wywołać go jawnie, jednak z definicji jest on wywoływany automatycznie przy niszczeniu obiektu.

Metody (niestatyczne) wywołujesz dla konkretnego obiektu, nie dla klasy. A więc nie: Timer::settime() czy samo settime(), ale: t1.settime().

int main()
{
    Timer t1; // tutaj już został wykonany konstruktor
    t1.settime(/* argumenty! */);
    t2.start(/* argumenty! */);
    return 0; // po opuszczeniu zakresu (np. wyjściu z funkcji) wywoływany jest destruktor
}

 

komentarz 10 maja 2017 przez Eryk Chojnacki Obywatel (1,420 p.)

A teraz co się stało?

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <conio.h>
#include "Timer.h"
int Timer::counting(h, m, s)
{
    bool start_pause=true;
    while(s && m && h>0 && start_pause==true)
    {
    start_pause=false;
    while(start_pause==false)
    {
    s-1;
    sleep(1000);
    cout<<h<<":"<<m<<":"<<s<<endl;
        if(s==0)
        {
            m-1;
        }
        if(m==0)
        {
            h-1;
        }
    }
    }
    friend void start();
    friend void pause();
    friend void timeend();
    return 0;
}

int Timer::settime(h, m, s)
{
    cout<<"Set time to counting: "<<endl;
    cout<<"Hours:"<<endl;
    cin>>h;
        if(h<0)
        {
            while(h<0)
            {
            cout<<"Unable number of s. Load number on plus or zero: "<<endl;
            cin>>h;
            }
        }
    cout<<"Minutes:"<<endl;
    cin>>m;
        if(m<0 || m>60)
        {
            while(m<0)
            {
            cout<<"Unable number of minutes. Load number from 0 to 60: "<<endl;
            cin>>m;
            }
        }
    cout<<"s:"<<endl;
    cin>>s;
    if(s<0 || s>60)
    {
        while(s<0)
        {
            cout<<"Unable number of seconds. Load number from 0 to 60: "<<endl;
            cin>>s;
        }
    }
    cout<<"Press enter to start"<<endl;
    friend void timeend();
    return 0;
}

int Timer::start(h, m, s)
{
    if(getch(13)&& start_pause==true)
    {
        counting();
    }
    cout<<"Press enter to stop"<<endl;
    return 0;
}

int Timer::pause(h, m, s)
{
    if(getch(13)&& start_pause==false)
    {
        start_pause=true;
    }
    return 0;
}
//zeruje licznik
int Timer::setend(h, m, s)
{
    if(getch(27))
    {
        h=0;
        m=0;
        s=0;
        settime();
    }
    return 0;
}

 

||=== Build: Debug in Nauak (compiler: GNU GCC Compiler) ===|
E:\Programy C++\Nauak\Timer.cpp|6|error: 'int Timer::counting' is not a static member of 'class Timer'|
E:\Programy C++\Nauak\Timer.cpp|6|error: 'h' was not declared in this scope|
E:\Programy C++\Nauak\Timer.cpp|6|error: 'm' was not declared in this scope|
E:\Programy C++\Nauak\Timer.cpp|6|error: 's' was not declared in this scope|
E:\Programy C++\Nauak\Timer.cpp|6|error: expression list treated as compound expression in initializer [-fpermissive]|
E:\Programy C++\Nauak\Timer.cpp|7|error: expected ',' or ';' before '{' token|
||=== Build failed: 6 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

 

komentarz 10 maja 2017 przez draghan VIP (106,230 p.)
Deklaracje przyjaźni powinny się pojawić w nagłówku, w deklaracji klasy. Tak nie definiuje się parametrów. Zawsze potrzebujesz typ plus ewentualnie nazwę, nie na odwrót. I dlaczego chcesz jako parametry do funkcji wrzucać h, m, s, skoro masz te pola dostępne w klasie?

Jako parametry przekazuje się coś, co chce się do funkcji wrzucić z zewnątrz. Czyli jak np. ustawiasz jakąś wartość, to właśnie jako parametr wrzucasz nową wartość, żeby funkcja zastąpiła starą wartość nową.
komentarz 10 maja 2017 przez Eryk Chojnacki Obywatel (1,420 p.)
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <conio.h>
#include "Timer.h"
using namespace std;

int main()
{
    Timer t1;
    t1.settime();
    t1.start();
    return 0;
}

void Timer::counting()
{
    while(seconds && minutes && hours>0 && start_pause==true)
    {
    start_pause=false;
    while(start_pause==false)
    {
    seconds-1;
    Sleep(1000);
    cout<<hours<<":"<<minutes<<":"<<seconds<<endl;
        if(seconds==0)
        {
            minutes-1;
        }
        if(minutes==0)
        {
            hours-1;
        }
    }
    }
}




||=== Build: Debug in Nauak (compiler: GNU GCC Compiler) ===|
E:\Programy C++\Nauak\Timer.cpp||In member function 'void Timer::counting()':|
E:\Programy C++\Nauak\Timer.cpp|17|warning: statement has no effect [-Wunused-value]|
E:\Programy C++\Nauak\Timer.cpp|22|warning: statement has no effect [-Wunused-value]|
E:\Programy C++\Nauak\Timer.cpp|26|warning: statement has no effect [-Wunused-value]|
obj\Debug\main.o||In function `main':|
E:\Programy C++\Nauak\main.cpp|10|undefined reference to `Timer::Timer()'|
E:\Programy C++\Nauak\main.cpp|13|undefined reference to `Timer::~Timer()'|
E:\Programy C++\Nauak\main.cpp|13|undefined reference to `Timer::~Timer()'|
||error: ld returned 1 exit status|
||=== Build failed: 4 error(s), 3 warning(s) (0 minute(s), 2 second(s)) ===|

 

komentarz 10 maja 2017 przez draghan VIP (106,230 p.)
Kompilator mówi Ci jasno, o co mu chodzi. Zdaje się, że nie zdefiniowałeś konstruktora i destruktora klasy Timer.

Podobne pytania

0 głosów
1 odpowiedź 235 wizyt
pytanie zadane 20 stycznia 2017 w PHP przez Miki Bywalec (2,480 p.)
0 głosów
2 odpowiedzi 489 wizyt
pytanie zadane 25 września 2019 w C i C++ przez Wiktor Michalski Początkujący (430 p.)
0 głosów
2 odpowiedzi 1,692 wizyt
pytanie zadane 30 listopada 2015 w C i C++ przez C☺ndzi Stary wyjadacz (12,100 p.)

92,579 zapytań

141,428 odpowiedzi

319,654 komentarzy

61,962 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...