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

not declared in this scope

VPS Starter Arubacloud
–1 głos
552 wizyt
pytanie zadane 19 sierpnia 2020 w C i C++ przez lujasjeden Użytkownik (860 p.)

main.cpp:

#include <iostream>
#include "polynomials.h"

using namespace std;

int main()
{
    for (;;)
    {
        Wx w;
        Px p;
        Result r;

        Polynomial *pointerWx;
        Polynomial *pointerPx;
        pointerWx=&w;
        pointerPx=&p;
        pointerWx->gather();
        pointerWx->show();
        pointerPx->gather();
        pointerPx->show();
        r.menu(w, p);
        r.showResult(w, p);
    }
}

polynomials.h:

#include <iostream>
#include <stdio.h>
#include <cstdlib>
using namespace std;

class Polynomial
{
public:
    virtual void gather()=0;
    virtual void show()=0;
};

class Px;
class Wx;

class Result
{
protected:
    string choiceStringNum;
    int resultDegree;
    int resultHelper;
    int choice;
    float *resultCoefficients;
public:
    void menu(Wx w, Px p);
    void addition(Wx w, Px p);
    void subtraction(Wx w, Px p);
    void showResult(Wx w, Px p);
    void isInteger(string &s, int &i);
    Result(string="0", int=0, int=0, int=0);

    ~Result();
};

class Wx :public Polynomial
{
protected:
    string degreeStringNum;
    int degree;
    int helper;
    float *coefficients;

public:
    virtual void gather();
    virtual void show();
    void isInteger(string &s, int &i);
    friend class Result;

    Wx(string="0", int=0, int=0);
    ~Wx();

};

class Px :public Wx
{
public:
    virtual void gather();
    virtual void show();
    friend class Result;
    Px(string="0", int=0, int=0);
    ~Px();
};

structors.cpp:

#include <iostream>
#include "polynomials.h"

using namespace std;

Wx::Wx(string dNS, int d, int h)
{
    degreeStringNum=dNS;
    degree=d;
    helper=h;
    coefficients=new float[d+1];
    //cout<<"Wx constructor called"<<endl;
}
Wx::~Wx()
{
    delete [] coefficients;
    //cout<<"Wx destructor called"<<endl;
}

Px::Px(string dNS, int d, int h)
:Wx(dNS, d, h)
{
    coefficients=new float[d+1];
    //cout<<"Px constructor called"<<endl;
}
Px::~Px()
{
    delete [] coefficients;
    //cout<<"Px destructor called"<<endl;
}

Result::Result(string chSN, int rD, int rH, int ch)
{
    choiceStringNum=chSN;
    resultDegree=rD;
    resultHelper=rH;
    choice=ch;
    resultCoefficients=new float[rD+1];
    //cout<<"Result constructor called"<<endl;
}
Result::~Result()
{
    delete [] resultCoefficients;
    //cout<<"Result destructor called"<<endl;
}

isInteger.cpp:

#include <iostream>
#include "polynomials.h"
#include <ctype.h> // isdigit()
#include <sstream> // stringstream
using namespace std;

void Wx::isInteger(string &s, int &i)
{
    int isInt=0;
    int decimalCount=0;

    bool isIntBool=false;
    bool containsSpaces = false;

    do
    {
        getline(cin >> ws, s);
        for (int i=0; i<s.size(); i++)
        {
            if (isspace(s[i]))
                containsSpaces=true;
        }

        if (s[0] == '-')
        {
            isInt++;

            if (s[1]=='0')
                isInt=0;
        }

        if ((s[0]=='0' && isdigit(s[1])))
            isInt = 0;
        else
        {
            for (int i=0; i<s.size(); i++)
            {
                if (isdigit(s[i]))
                    isInt++;
                if (s[i]=='.')
                    decimalCount++;
            }
        }

        if (decimalCount==1)
            isInt=0;

        if (isInt==s.size() && containsSpaces==false)
        {
            stringstream str_stream_object(s);
            str_stream_object>>i;

            isIntBool=1;
        }

        else
        {
            cout<<endl;
            if (s==degreeStringNum && i==degree)
            cout<<"Degree of polynomial has to be an integer greater than 0, try again: ";
            else if (s==choiceStringNum && i==choice)
            cout<<"There is no such option, try again: ";

            isIntBool=0;
            isInt=0;
            decimalCount=0;
            containsSpaces=false;
        }

    }
    while (isIntBool==0);
}

menu.cpp:

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

void Result::menu(Wx w, Px p)
{
    cout<<"Main menu"<<endl;
    cout<<"---------------------"<<endl;
    cout<<"1.Addition"<<endl;
    cout<<"2.Subtraction"<<endl;
    cout<<"3.Multiplication"<<endl;
    cout<<"4.Division"<<endl;
    cout<<"5.Exit"<<endl;
    cout<<endl;
    cout<<"Choose an operation: ";
    isInteger(choiceStringNum, choice);

    switch(choice)
    {
    case 1:
        {
            cout<<"W(x)+P(x) = ";
            addition(w, p);
        }
        break;
    case 2:
        {
            cout<<"W(x)-P(x) = ";
            subtraction(w, p);
        }
        break;
    case 3:
        {

        }
        break;
    case 4:
        {

        }
        break;
    case 5:
        {
            cout<<"Goodbye";
            exit(0);
        }
        break;
    default:
        {
            cout<<"There is no such option";
        }
    }
}

error:

 kopia\isInteger.cpp|61|error: 'choiceStringNum' was not declared in this scope|
 kopia\isInteger.cpp|61|error: 'choice' was not declared in this scope|

jak moglbym zrobic tak abym mogl wysylac z klasy Result argumenty do funkcji isInteger?

1 odpowiedź

0 głosów
odpowiedź 20 sierpnia 2020 przez j23 Mędrzec (195,220 p.)

Przecież przekazujesz w parametrach te zmienne. Dlaczego odwołujesz się do nazw choiceStringNum i choice zamiast odpowiednio s i i?

Dodatkowo wywołanie powinno wyglądać np. tak: w.isInteger(choiceStringNum, choice);

komentarz 20 sierpnia 2020 przez lujasjeden Użytkownik (860 p.)

tzn w calej funkcji to odwoluje sie do nazw s oraz i ale chcialbym zeby ta funkcja zwracala w zaleznosci co do niej przyjdzie inny wyswietlany napis bo chcialem ja wykorzystac do sprawdzenia czy stopien wielomianu jest liczba calkowita, jak nie to wyswietlic napis:

cout<<"Degree of polynomial has to be an integer greater than 0, try again: ";

oraz sprawdzic czy wybor uzytkownika w switchu jest liczba calkowita jak nie to wyswietlic napis:

cout<<"There is no such option, try again: ";

stąd kod:

            if (s==degreeStringNum && i==degree)
            cout<<"Degree of polynomial has to be an integer greater than 0, try again: ";
            else if (s==choiceStringNum && i==choice)
            cout<<"There is no such option, try again: ";

 

komentarz 20 sierpnia 2020 przez j23 Mędrzec (195,220 p.)

Jeśli s i i mają coś tam zwracać, to zrób np. tak:

std::pair<std::string, int> Wx::isInteger(const std::string& degreeStringNum, int degree)
{
    int isInt = 0;
    int decimalCount = 0;
    bool isIntBool = false;
    bool containsSpaces = false;
    std::string s; 
    int i; 
    ...

    return { s, i };
}
auto res = w.isInteger(choiceStringNum, choice);
std::cout << res.first << '\n'; // string
std::cout << res.second << '\n'; // int

 

komentarz 20 sierpnia 2020 przez lujasjeden Użytkownik (860 p.)

po researchu i zaimplementowaniu twojej propozycji mam tak:

 kopia\isInteger.cpp|7|error: two or more data types in declaration of 'isInteger'|

aczkolwiek nie wiem czy dobrze sie rozumiemy, bardzo mozliwe, ze nie bo juz zostalo mi zwrocone uwage ze mam problem z formulowaniem pytan i myle pojecia nieraz, sproboje wytlumaczyc najprosciej o co mi chodzi:

Funkcje isInteger wywoluje w moim kodzie  3 razy (2 razy wtedy kiedy posylam jej degreeStringNum oraz degree i  raz kiedy posylam jej choiceStringNum oraz choice), przy takim zapisie:

            if (s==degreeStringNum && i==degree)
            cout<<"Degree of polynomial has to be an integer greater than 0, try again: ";
           // else if (s==choiceStringNum && i==choice)
           // cout<<"There is no such option, try again: ";

(dalem w komentarze kod ktory nie dziala, po wykomentowaniu jest ok ale nie tak jak bym chcial), dziala to w ten sposob ze kiedy zostaje wywolana kiedy posyla jej sie degreeStringNum oraz degree to wypisuje: Degree of polynomial has to be an integer greater than 0, try again: " a kiedy posyla jej sie choiceStringNum oraz choice to funkcja dziala, tzn trzeba wpisywac input do skutku az sie nie wpisze liczy calkowitej aczkolwiek nie wypisuje nic (no to oczywiste bo nie jest nic zapisane) ale ja chcialbym aby w tej wlasnie sytuacji funkcja wypisywala "There is no such option, try again: ", po prostu chcialbym aby funkcja zachowywala sie inaczej w zaleznosci od poslanych argumentow (inny wyswietlony napis). Czy tak dziala twoja propozycja? Bo przyznam ze boje sie powiedziec ze nie jestem pewny bo tez dopiero zaczynam i duzo tych zapisow przed zobaczeniem co w ogole znacza nie znalem.

komentarz 20 sierpnia 2020 przez lujasjeden Użytkownik (860 p.)

ok poradzilem sobie w ten sposob ze zamiast 

else if (s==choiceStringNum && i==choice)

dalem samo else ale problem zaczalby sie kiedy chcialbym wywolac funkcje jeszcze gdzie indziej i dac jeszcze inny output, plus to ze jestem ciekawy jak poradzic sobie z tym korzystajac dalej z else if 

Podobne pytania

0 głosów
2 odpowiedzi 567 wizyt
pytanie zadane 4 maja 2020 w C i C++ przez kwazi Nowicjusz (120 p.)
0 głosów
1 odpowiedź 701 wizyt
pytanie zadane 23 października 2019 w C i C++ przez darekdede1995 Nowicjusz (180 p.)
0 głosów
1 odpowiedź 457 wizyt

92,841 zapytań

141,781 odpowiedzi

320,857 komentarzy

62,173 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.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...