Nauka c++ co można poprawić

Pytania i problemy
cpp
wazer
wazer

co można zrobić lepiej? czemu nie działa przestrzeń nazw, którą chciałem użyć w obliczenia.h> dlaczego program najpierw pyta o liczba 2, a nie odwrotnie opcja:1 Podaj liczbe: 2:5.4 Podaj liczbe: 1:2.5 main.cpp:

//c++ 20
#include 
#include "obliczenia.h"

using namespace std;

int main() {
    //constexpr string szMessage {"Podaj liczbe:"};
    //constexpr char szMessage[] = {"Podaj liczbe:"};
    const string szMessage{"Podaj liczbe:"};
    while (true) {
        switch (iGetInteger("1.prostokat0.wyjdz\nopcja:")) {
            case 1:
                switch (iGetInteger("1.obwod \n2.pole \nopcja:")) {
                    case 1:
                        cout << (dblObwodProstokat(dblGetDouble(szMessage + " 1:"), dblGetDouble(szMessage + " 2:")))
                             << endl;
                        break;
                    case 2:
                        cout << (dblPoleProstokat(dblGetDouble(szMessage + " 1:"), dblGetDouble(szMessage + " 2:")))
                             << endl;
                        break;
                    default:
                        cout << "nie znaleziono takiej opcji";
                        break;
                }
                break;
            case 0:
                return 0;
                break;
            default:
                cout << "nie znaleziono takiej opcji";
                break;
        }
    }
}

obliczenia.cpp:

#include 


using namespace std;

int iGetInteger(const string &szMessage) {
    int iNumber;
    cout << szMessage;
    cin >> iNumber;
    return iNumber;
}

double dblGetDouble(const string &szMessage) {
    double dblNumber;
    cout << szMessage;
    cin >> dblNumber;
    return dblNumber;
}

double dblObwodProstokat(double dblNumber1, double dblNumber2 = 898766.0) {
    if(dblNumber2==898766.0)dblNumber2=dblNumber1;
    if (dblNumber1 > 0.0 && dblNumber2 > 0.0) {
        return 2 * dblNumber1 + 2 * dblNumber2;
    }
    return 0;
}

double dblPoleProstokat(double dblNumber1, double dblNumber2) {
    if (dblNumber1 > 0 && dblNumber2 > 0) {
        return dblNumber1 * dblNumber2;
    }
    return 0;
}

obliczenia.h:

#include using namespace std; #ifndef UNTITLED_OBLICZENIA_H #define UNTITLED_OBLICZENIA_H //namespace obliczenia { int iGetInteger(const string &szMessage);

double dblGetDouble(const string &szMessage);

double dblObwodProstokat(double dblNumber1, double dblNumber2 = 898766.0);

double dblPoleProstokat(double dblNumber1, double dblNumber2); //} #endif //UNTITLED_OBLICZENIA_H

wazer
wazer

link do pobrania projekt.7z

KrEdEnS
KrEdEnS Moderator Freebies

@wazer Jeżeli możesz wrzuć w temat pliki:

image|227x79

image|133x76

image|690x293

wazer
wazer

nie da się pisało że nie mogę

mloskot
mloskot

Ponieważ w obliczenia.cpp nie definiujesz niczego w przestrzeni obliczenia. 'Opakuj' wszystkie definicje w namespace obliczenia { oraz } podobnie jak to zrobiłeś w nagłówku obliczenia.h.

Dodatkowo, w plikach nagłówkowych unikaj using namespace std importujące definicje z std do globalnej przestrzeni.

wazer
wazer

wazer:

rw pyta o liczba 2, a nie odwrotnie Umieściłem definicje w przestrzeni nazw obliczenia, tak jak pisałeś i działa :slight_smile: mam jeszcze trzy dodatkowe pytanie Dlaczego w linii 9 main.cpp zmienna szMessage nie może być constexpr?

Usunąłem using namespace std z pliku nagłówkowego obliczenia.h i dodałem do stringów std::, wszystko działa 👍

Spróbowałem usunąć dyrektywe #include z obliczenia.h i wszystko działa bez problemu :thonking: Dlaczego po usunięciu dyrektywy include z pliku nagłówkowego wszystkie deklaracje funkcji z argumentami string działają bez problemu?

Dlaczego jak usunę #include z main.cpp to w pliku obliczenia.h deklaracje stringów już nie działają ? Spodziewałem się że plik main.cpp nie będzie miał wpływu na obliczenia.h i nie będzie działał tylko plik main.cpp

mloskot
mloskot

wazer:

Dlaczego w linii 9 main.cpp zmienna szMessage nie może być constexpr?

Może być, zobacz tu https://godbolt.org/z/P99eaq

Może używasz kompilatora bez wsparcia C++11 lub kompilujesz bez odpowiedniej opcji (e.g. -std=c++11).

wazer:

Spróbowałem usunąć dyrektywe #include z obliczenia.h i wszystko działa bez problemu :thonking: Dlaczego po usunięciu dyrektywy include z pliku nagłówkowego wszystkie deklaracje funkcji z argumentami string działają bez problemu? Dlaczego jak usunę #include z main.cpp to w pliku obliczenia.h deklaracje stringów już nie działają ?

Ponieważ w main.cpp masz #include przed swoim nagłówkiem:

#include 
#include "obliczenia.h"

a sam dołącza.

system
system

Ten temat został automatycznie zamknięty 32 dni po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe.