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

Obiektowy Cpp - zwracanie struktury z klasy

Object Storage Arubacloud
0 głosów
300 wizyt
pytanie zadane 27 maja 2018 w C i C++ przez Stu Nowicjusz (190 p.)

Witam. Przestawię uproszczony opis mojego problemu. W klasie "klasa" otrzymują z czujników w jednej wiadomości 3 parametry: czas(int), stan(string) i wysokość(float). Chciałbym te dane zwrócić nie pojedynczo ale jako struktura (to mój pierwszy kontakt ze strukturą. Znalazłem w internecie przykład zwracania struktury przez funkcję ale dla podejścia proceduralnego:

#include <iostream>
using namespace std;

struct Person {
    char name[50];
    int age;
    float salary;
};

Person getData(Person); 
void displayData(Person); 

int main()
{

    Person p;

    p = getData(p);   
    displayData(p);

    return 0;
}

Person getData(Person p) {

    cout << "Enter Full name: ";
    cin.get(p.name, 50);

    cout << "Enter age: ";
    cin >> p.age;

    cout << "Enter salary: ";
    cin >> p.salary;

    return p;
}

void displayData(Person p)
{
    cout << "\nDisplaying Information." << endl;
    cout << "Name: " << p.name << endl;
    cout <<"Age: " << p.age << endl;
    cout << "Salary: " << p.salary;
}

Teraz próbuję zamienić powyższy program na program obiektowy. Niestety nie mam pojęcia jak to zrobić i nie mogę nawet skompilować ;/ oto co wyskrobałem:

main:

#include <iostream>
#include "klasa.h"
using namespace std;
struct Person { 
char name[50]; 
int age; 
float salary; };

int main()
{


    klasa jeden;
    person p2;
    p2 = jeden.getData(p2);

    cout << "\nDisplaying Information." << endl;
    cout << "Name: " << p2.name << endl;
    cout <<"Age: " << p2.age << endl;
    cout << "Salary: " << p2.salary;
    return 0;
}

klasa.cpp

#include <iostream>
#include "klasa.h"
using namespace std;

Person klasa::getData(Person p) {

    p.name = "adam";
    p.age=20;
    p.salary=10;

    return p;
}

klasa::klasa(){}
klasa::~klasa(){}

klasa.h

#include <iostream>
using namespace std;

class klasa
{
    public:

     struct Person {
        char name[50];
        int age;
        float salary;
    };

    Person p;

    klasa();
    ~klasa();

    Person getData(Person);
};

Ogólnie podsumowując chciałbym aby dane które są przypisane w klasie zostały zwrócone do maina jako struktura . Bardzo proszę o pomoc ;)

1
komentarz 27 maja 2018 przez Aisekai Nałogowiec (42,190 p.)
Uwaga odnośnie kodu z strukturą:

Takich funkcji (o takim ciele) jak getData(Person p); się nie robi. Czemu? Uniemożliwia to wykorzystanie ich w aplikacjach niekonsolowych, nie wprowadzając zmian (modyfikacja kodu łamie jedną z zasad SOLID). O ile jest to dość krótka funkcja, i przepisanie jej nie stanowi problemu, o tyle wprowadzasz tym niepotrzebnie złe nawyki.
komentarz 27 maja 2018 przez Stu Nowicjusz (190 p.)
Dziękuję za odpowiedź. Masz propozycję jakbym mógł rozwiązać mój problem tj. zwracanie struktury z klasy?

2 odpowiedzi

0 głosów
odpowiedź 27 maja 2018 przez RafalS VIP (122,820 p.)
edycja 27 maja 2018 przez RafalS

Jeśli zdeklarowałeś strukture Person w klasie klasa to nazwa Person nie jest normalnie widoczna globalnie. Trzeba wyciągnąć ją z klasy klasa w ten sposób:

klasa::Person klasa::getData(Person p) {

W argumencie nie musiałeś bo argument jest tak jakby częścią klasy i naturalnie typ Person jest widoczny z wnętrza klasy. Podobnie w mainie też musisz się odwoływać do struktury Person przy pomocy operatora zakresu, bo struktura ta nie jest tam widoczna.
Po drugie w tej linijce:

	p.name = "adam";

próbujesz zrobić coś takiego:

char name[50];
name = "adam";

Bo stworzenie struktury Person p alokuje wszystkie jej składniki.


EDIT: Doczytałem właśnie, że pierwszy raz spotykasz się ze strukturą. Jeśli tak to nie kombinuj z definiowaniem struktury w ciele innej klasy tylko umieść definicję w obszarze globalnym. Najlepiej w oddzielnym pliku tak jak robisz to z klasami.

Generalnie struktura od klasy różni się tylko domyślnym modyfikatorem zakresu. W klasie jak zrobisz:

class Person {
	int wiek;
};

to wiek będzie prywatny, a w strutkurze:

struct Person {
	int wiek;
};

będzie publiczny. 
To samo przy domyślnym dziedziczeniu.
Poza domyślnym modyfikatorem zakresu struktura od klasy nie różni się niczym. Przynajmniej w C++ (w C struktura nie może mieć metod, bo jest to język strukturalny). Podmień sobie class na struct w klasa.h i zobaczysz, że nic się nie zmieniło.

Z racji domyślnego modyfikatora public w strukturze przyjęło się, że wykorzystuje się ją właśnie jako takie pudełko na kilka publicznych składowych (czyli taka struktura z C).

 

0 głosów
odpowiedź 27 maja 2018 przez mokrowski Mędrzec (155,460 p.)

Tu akurat nie ma co deliberować. Prosty przykład:

#include <iostream>
#include <string>
// C++11 

struct Measure {
    unsigned time_stamp;
    std::string state;
    float height;
};

class SensorManager {
public:
    Measure getMeasure() const {
        // C++11 - łatwe zwrócenie struktury.
        return { getTimeStamp(), getState(), getHeight() };
    }
private:
    unsigned getTimeStamp() const {
        return 1244433; // Fake timestamp
    }
    std::string getState() const {
        return "ok"; // Fake state
    }
    float getHeight() const {
        return 3.1415; // Fake height
    }

};

int main() {
    SensorManager smanager;
    Measure measure = smanager.getMeasure();
    std::cout << "TimeStamp = " << measure.time_stamp
        << " State = " << measure.state
        << " Height = " << measure.height << '\n';
}

Kompiluj w trybie C++11... 

Podobne pytania

0 głosów
1 odpowiedź 143 wizyt
pytanie zadane 13 czerwca 2018 w C i C++ przez Sic Dyskutant (8,510 p.)
0 głosów
3 odpowiedzi 285 wizyt
0 głosów
1 odpowiedź 151 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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!

...