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

pole klasy = metoda()?

VPS Starter Arubacloud
0 głosów
320 wizyt
pytanie zadane 10 maja 2019 w C i C++ przez niezalogowany
otwarte ponownie 25 maja 2019

Czy można polu myclass  przypisać metodę  myclass () punkt (1) i (2) i dla punktu jeden dane wyjściowe się zgadzają, ale dla punku 2 już nie mimo że kompilator nie zgłasza błędów. Idea jest taka by tylko raz obliczyć funkcję i dalej korzystać z pola klasy.

Ja wiem że to poniżej nie ma wiele wspólnego z obiektówką, ale czasami działa dobrze. Tylko martwi mnie te czasami.

class Moja_klasa_zbiorcza
{
...........
obiekt1 col;
obiekt2 p;
..............

double c=wspolczynnik_C(); // (1) - tu mi przypisanie zadziałało nie wiem dlaczego;
double lcp=l_cp(); // (2) - a tu już nie;

double wynik (){
       if (l_cp()>0)
            return fj()*( hcp()*bcp()-l_cp()*(bcp()-col.tw-2*c));
        else return fj()*hcp()*bcp();
        }

    double hcp(){
        return min(p.hp,col.h*2*c);
        }

    double bcp(){
        return min(p.bp,col.b +2*wspolczynnik_C());
        }

    double l_cp (){
        return col.h-2*col.tf-2*c;
        }

}

Zadałem pytanie po uprzednim przeszukaniu Google znalazłem wiele ciekawych tematów, które mnie odciągnęły od głównego tematu, ale odpowiedzi dokładnej nie znalazłem.

komentarz 10 maja 2019 przez adrian17 Ekspert (344,100 p.)
Pokaż proszę cały kod.
komentarz 10 maja 2019 przez niezalogowany

to jest na razie koncept dużo innych rzeczy jest niekoniecznie fajnych, ale to jest jakiś tam wstęp do wstępu.  Ale proszę.

#include <iostream>
#include <cmath>
#include <algorithm>
#define fo(x) std::cout<<"___________"<<(#x)<<"="<<(x)<<"_________"<<endl;
# define MIN(x,y) (((x)<(y))?(x):(y))
# define DODATNI(x) (((x)>(0))?(x):(0))


using namespace std;



struct  strucMaterial{
    char	klasa_betonu[7] ;
    double  fck ;
    double  fck_cube ;
    double	fcd;
    double  fcm;
    double	fctm ;
    double	fctk_0_05;
    double	fctd ;
    double	fctk_0_95 ;
    double	Ecm ;
};

struct  MaterialStal{
    char	klasa_betonu[7]="S 235";
    double  fy = 235 ;
    double  fy40_80=215;
    double	fu=360;
    double  f40_80=360;
    double	E=205;
};

class BetonWlasciwosci{
    strucMaterial klasa[9]{
                            {	"C12/15", 12, 15, 8.57, 20, 1.6, 1.1, 0.79, 2.0, 27},
                            {	"C16/20", 16, 20, 11.43, 24, 1.9, 1.3, 0.93, 2.5, 29},
                            {	"C20/25",20,25,14.29,28,2.2,1.5,1.07,2.9,30},
                            {	"C25/30",25,30,16.67,33,2.6,1.8,1.29,3.3,31},
                            {	"C30/37",30,37,21.43,38,2.9,2.0,1.43,3.8,33},
                            {	"C35/45",35,45,25,43,3.2,2.2,1.57,4.2,34},
                            {	"C40/50",40,50,28.57,48,3.5,2.5,1.76,4.6,35},
                            {	"C45/55",45,55,32.14,53,3.8,2.7,1.93,4.9,36},
                            {	"C50/60",50,60,35.71,58,4.1,2.9, 2.07,5.3,37},};

    public:strucMaterial kln (char* naz)
        {
           //naz[7]='/0';
            cout<<naz<<endl;
          for (int i=0; i<9; i++){cout<< klasa[i].klasa_betonu<<"\t";
            if (klasa[i].klasa_betonu==naz)  return klasa[i];
          }
          return klasa[0];
        }

    public:strucMaterial kl (int naz){

        return klasa[naz];
        }


};

class gamma{
    public:
    double M0=1.00;
    double M1=1.25;
    double C=1.5;
};

class wymiaryblacha
{
   public:
    double hp;
    double bp;
    double tp;
};

class wymiarystopa
{
    double dr;
    double eb;
    double eh;
    double em;
};

class materialblacha
{
public:    double fyp;
};

class przekroj
{
  public:
    double h, b,tw,tf,r,M;
 };

 class blachaPodstawy{

    wymiaryblacha p;
    materialblacha fyp;
    przekroj col;
    int ktory=0;  //klasa betonu
    BetonWlasciwosci f;

    gamma ga;

    double betaj=2/3.0;
    double alfacc=1;

    double c=maksymalnyWsieg_C();

public: blachaPodstawy (wymiaryblacha pp, materialblacha matbl, przekroj column, int ktoryy):
        p(pp) , fyp (matbl), col(column) , ktory (ktoryy){

        }
    double nosnosRownyDocisk (){
        return min((docisk_fj()*( hcp()*bcp()-l_cp()*(bcp()-col.tw-2*c))),(docisk_fj()*hcp()*bcp()));
        }
    double hcp() {
        return min(p.hp,col.h*2*c);
    }

    double bcp() {
        return min(p.bp,col.b +2*maksymalnyWsieg_C());
    }

    double l_cp () {
        return col.h-2*col.tf-2*c;
    }

    //double beta_C();

    double maksymalnyWsieg_C () {
        return  p.tp*sqrt(fyp.fyp/(3*docisk_fj()*ga.M0));
    }


    double alfabf () {
        double *tab[] = new double [4];


        return 1,5;
        //return 1.67;
    }

    double docisk_fj () {
        //return 2/3.0*1.67*f.kl(ktory).fcd;
        return f.kl(ktory).fcd;
    }



 };


int main()
{

    przekroj I{450,190,9.4,14.7,18,49.1};
    wymiaryblacha bl{480,220,10};
    materialblacha fb {235};
    blachaPodstawy wymir (bl,fb,I,3);

    BetonWlasciwosci aaa;
    fo(aaa.kl(3).fcd*0.667*1.67);

    fo(wymir.maksymalnyWsieg_C());
    fo(wymir.docisk_fj());
    fo(wymir.alfabf());
    fo(wymir.bcp());
    fo(wymir.hcp());
    fo(wymir.l_cp());
    fo(wymir.nosnosRownyDocisk()/1000.0);


    return 0;
}

 

komentarz 11 maja 2019 przez adrian17 Ekspert (344,100 p.)

Na pewno to ten sam kod, który testujesz? Bo to:

double *tab[] = new double [4];

Nie powinno się skompilować i nie kompiluje się na żadnym kompilatorze który testowałem.

double lcp=l_cp();

Tej linii też nie ma w tym pliku

komentarz 11 maja 2019 przez niezalogowany
edycja 11 maja 2019

miedzy czasie coś tam dodałem i odjąłem.

Linii nie ma bo nie działała to wykasowałem. 

a to wydruk skompilowanego programu alfabf się nie zgadza bo już ją zacząłem okodowywać i nie skończyłem,  ale zmieniłem na double tab [4];

Bo jak dodałem przed  returnem delete [] to i chciałem zwrócić wynik, i który przełożony był do innej zmiennej double to i tak kompilator krzyczał że wykasowałem mu tablicę 

___________aaa.kl(3).fcd*0.667*1.67=18.5685_________
___________wymir.maksymalnyWsieg_C()=21.6773_________
___________wymir.docisk_fj()=16.67_________
___________wymir.alfabf()=2.04167_________
___________wymir.bcp()=220_________
___________wymir.hcp()=480_________
___________wymir.l_cp()=377.245_________
___________wymir.nosnosRownyDocisk()/1000.0=708.599_________

Process returned 0 (0x0)   execution time : 1.873 s
Press any key to continue.

a tak rzeczywiście błąd składniowy, ale to się kompiluje

  double alfabf () {
        double *tab = new double [4];
        tab[0]=(1+stopa.dr/(max(p.hp,p.bp))); // tu już znowu kod zmieniony dodany obiekt stopa
        tab[1]=(1+2*stopa.eh/p.hp);
        tab[2]=(1+2*stopa.eb/p.bp);
        tab[3]=(3);
        return *(min(tab,tab+3));

 

komentarz 12 maja 2019 przez adrian17 Ekspert (344,100 p.)
Patrzyłem na to jeszcze raz, ale bez aktualnego kodu trudno cokolwiek powiedzieć... no i też nie wiem, skąd wiesz że wynik jest niepoprawny; jaki jest, a jaki powinien być?
komentarz 13 maja 2019 przez niezalogowany
Jak chcesz to mogę wrzucić, ale teraz działa dobrze mimo przypisania metody do pola, tylko l_cp() napisana w inny sposób.

Generalnie chodziło czy można przypisać metodę do pola tej samej klasy, po co? np: gdy wywołuję drugą metodę, w której w ciele ma pięć razy wywołaną pierwszą metodę to jak za każdym razem oblicza, to nie fajnie. A jak miałbym w polu, to w polu przechowuję tylko wartość i odwołuję się do wartości (której tak faktycznie jeszcze nie ma bez obiektu) i tylko raz wywołuje pierwsza metodę.

próbowałem coś ze wskazaniem na funkcję, ale coś nie pykło

Skąd wiem że źle działa, tu akurat napisałem sobie w mathcadie procedurę, krótka więc nie zajęło to dużo czasu i porównałem wyniki i wyrzuciłem na ekran cout'em wątpliwe punkty programu. Kiedyś debugagowałem, ale debagger w C::B przestał mnie słuchać więc omijam i schodziło dłużej niż normalnie.
komentarz 13 maja 2019 przez adrian17 Ekspert (344,100 p.)

Ogólnie to nie jest najlepszy pomysł; to nie jest tak, że czytanie pola jest "leniwe" i dzieje się przy pierwszym odczycie zmiennej. To wywołanie metody dzieje się podczas inicjalizacji obiektu, przed konstruktorem. Na przykład:

struct A{
  int a = 5;
  int b = 6;
  int c = f();
  
  int f(){ return a+b; }
};

Tu jest OK i `c` będzie 11, ale wystarczy że zmienimy kolejność pól:

struct A{
  int a = 5;
  int c = f(); // przesuniete linie wyzej
  int b = 6;
  
  int f(){ return a+b; }
};

I ten kod już jest technicznie niepoprawny i niezdefiniowany.

komentarz 13 maja 2019 przez niezalogowany

Ogólnie to nie jest najlepszy pomysł

 Głównie o to mi chodziło, czy tak się robi czy nie, bo jak to obejść to ja w sumie wiem, tak mi się przynajmniej wydaje.

1 odpowiedź

0 głosów
odpowiedź 10 maja 2019 przez Secrus Nałogowiec (32,880 p.)
A jaki błąd daje ci kompilator? czytaj co pisze, bo on najlepiej wie co mu nie pasuje
komentarz 10 maja 2019 przez niezalogowany
W tym sęk, że żadnego błędu kompilator nie zgłasza.

Tylko wyniki są błędne jak za l_cp() podstawię lcp (daną z pola). Daje taki wyniki jak by były tam śmieci a nie wartość metody I_cp();
komentarz 10 maja 2019 przez Secrus Nałogowiec (32,880 p.)
a co to za funkcja wspolczynnik_c()?
komentarz 10 maja 2019 przez niezalogowany
double współczynnik_c ()
    {
       return  p.tp*sqrt(fyp.fyp/(3*fj()*ga.M0));
    }

od coś takiego, zwykłe pierwiastkowanie
komentarz 10 maja 2019 przez Secrus Nałogowiec (32,880 p.)
a gdzie się ona znajduje? includujesz plik w ktorym jest? to metoda jakiegos obiektu?
komentarz 10 maja 2019 przez niezalogowany
edycja 10 maja 2019
obiekt jest jeden w main () i tam planuję połączyć z QT widget, a składa się z innych obiektów ,też po jednym typu materiał, wymiary, itd.. i do tych obiektów odwołuję się w klasie głównej.

funkcje to porostu wzory matematyczne i ta główna klasa to szablon dla danego typu obiektu. Tu stopa, ale może być i słup i belka. Podklasy zostaną takie same lub podobne tylko szablon się zmieni.
komentarz 14 maja 2019 przez niezalogowany

Znalazłem rozwiązanie o które mi chodziło tylko nie wiedziałem jak o to zapytać. Temat do zamknięcia.

    double wynik() {
        double l=this->l_cp();
        double h=this->hcp();
        double b=this->bcp();
        double fj=this->fj()
        if (l>0)
            return fj*( h*b-l*(b-col.tw-2*c));
        else
            return fj*h*b;
    }

 

komentarz 25 maja 2019 przez niezalogowany
edycja 25 maja 2019

@Secrus, @adrian17

Wszystko grało do puki nie przeciążyłem konstruktora i jak używam jednego konstruktora to mam jeden wynik a jak drugiego to inny wynik.

  blachaPodstawy wymir (bl,fb,I,"C25/30",st); //tu błędny wynik
//a jak 
    blachaPodstawy wymir (bl,fb,I,3,st); // tu prawidłowy 

a tu cały kod trochę bezsensu, ale coś tam liczył.

#include <iostream>
#include <cmath>
#include <algorithm>
#define fo(x) std::cout<<"___________"<<(#x)<<"="<<(x)<<"_________"<<endl;
# define MIN(x,y) (((x)<(y))?(x):(y))
# define DODATNI(x) (((x)>(0))?(x):(0))


using namespace std;


struct  strucMaterial {
    string 	klasa_betonu;
    double  fck ;
    double  fck_cube ;
    double	fcd;
    double  fcm;
    double	fctm ;
    double	fctk_0_05;
    double	fctd ;
    double	fctk_0_95 ;
    double	Ecm ;
};

struct  MaterialStal {
    char	klasa_betonu[7]="S 235";
    double  fy = 235 ;
    double  fy40_80=215;
    double	fu=360;
    double  f40_80=360;
    double	E=205;
};

class BetonWlasciwosci {
    strucMaterial klasa[9] {
        {	"C12/15", 12, 15, 8.57, 20, 1.6, 1.1, 0.79, 2.0, 27},
        {	"C16/20", 16, 20, 11.43, 24, 1.9, 1.3, 0.93, 2.5, 29},
        {	"C20/25",20,25,14.29,28,2.2,1.5,1.07,2.9,30},
        {	"C25/30",25,30,16.67,33,2.6,1.8,1.29,3.3,31},
        {	"C30/37",30,37,21.43,38,2.9,2.0,1.43,3.8,33},
        {	"C35/45",35,45,25,43,3.2,2.2,1.57,4.2,34},
        {	"C40/50",40,50,28.57,48,3.5,2.5,1.76,4.6,35},
        {	"C45/55",45,55,32.14,53,3.8,2.7,1.93,4.9,36},
        {	"C50/60",50,60,35.71,58,4.1,2.9, 2.07,5.3,37},
    };
// enum klasaBetonu ={	"C12/15	",	"C16/20	",	"C20/25	",	"C25/30	",	"C30/37	",	"C35/45	",	"C40/50	",	"C45/55	",	"C50/60	"};

  public:
    strucMaterial kl (string nazw) {
        //naz[7]='/0';
        //cout<<nazw<<endl;
        for (int i=0; i<9; i++) {
     //       cout<< klasa[i].klasa_betonu<<"\t";
            if (klasa[i].klasa_betonu==nazw)
                return klasa[i];
        }
        return klasa[0];
    }

  public:
    strucMaterial kl (int naz) {

        return klasa[naz];
    }

};

class gamma {
  public:
    double M0=1.00;
    double M1=1.25;
    double C=1.5;
};

class wymiaryblacha {
  public:
    double hp;
    double bp;
    double tp;
};

struct wymiarystopa {
    double dr;
    double L;
    double B;
    double eb;
    double eh;
    double em;
};

class materialblacha {
  public:
    double fyp;
};

class przekroj {
  public:
    double h, b,tw,tf,r,M;
};

class blachaPodstawy {

    wymiaryblacha p;
    materialblacha fyp;
    przekroj col;
    wymiarystopa stopa;
    int ktory=0;  //klasa betonu
    BetonWlasciwosci f;

    gamma ga;

    double betaj=2/3.0;
    double alfacc=1;
    double c=maksymalnyWsieg_C();

  public:
    blachaPodstawy (wymiaryblacha pp, materialblacha matbl, przekroj column, int ktoryy, wymiarystopa ws):
        p(pp), fyp (matbl), col(column), ktory (ktoryy), stopa(ws) {

        }

     blachaPodstawy (wymiaryblacha pp, materialblacha matbl, przekroj column, string ktoryy, wymiarystopa ws):
        p(pp), fyp (matbl), col(column), stopa(ws) {
        string ktorystr=ktoryy;
        bool war1=0;
        string klasy[10] ={	"C12/15	",	"C16/20",	"C20/25",	"C25/30",	"C30/37",	"C35/45",	"C40/50",	"C45/55",	"C50/60	",""};
        for (ktory=0; ktory<10; ktory++) {
        //  cout <<ktorystr<<"---------"<<klasy[ktory]<<endl;;
            if(klasy[ktory]==ktorystr) {
                war1=1;
                break;
            }
        }

       fo (ktory);
       this->ktory=2;
   //    fo (war1);
        if (war1==0)  ktory=0;
    //    fo (ktory);
  //    fo (war1);

        }


    double nosnosRownyDocisk () {
        return min((docisk_fj()*( hcp()*bcp()-l_cp()*(bcp()-col.tw-2*c))),(docisk_fj()*hcp()*bcp()));
    }
  void notatki ()  {
         /*     double nosnosRownyDocisk () {
            double lcp=this->l_cp();
        if (lcp>0) return (docisk_fj()*( hcp()*bcp()-lcp*(bcp()-col.tw-2*c)));
            return (docisk_fj()*hcp()*bcp());
    }
   */
/*
       double nosnosRownyDocisk() {
        double l=this->l_cp();
        double h=this->hcp();
        double b=this->bcp();
        double fj=this->docisk_fj();
        if (l>0)
            return fj*( h*b-l*(b-col.tw-2*c));
        else
            return fj*h*b;
    }
*/
    }

    double hcp() {
        return min(p.hp,col.h*2*c);
    }

    double bcp() {
        return min(p.bp,col.b +2*maksymalnyWsieg_C());
    }

    double l_cp () {
        return col.h-2*col.tf-2*c;
    }

    //double beta_C();

    double maksymalnyWsieg_C () {
        return  p.tp*sqrt(fyp.fyp/(3*docisk_fj()*ga.M0));
    }

    double alfabf () {
        // double *tab = new double [4];
        double tab[4];
        tab[0]=(1+stopa.dr/(max(p.hp,p.bp)));
        tab[1]=(1+2*stopa.eh/p.hp);
        tab[2]=(1+2*stopa.eb/p.bp);
        tab[3]=(3);

        double * wsktab=&tab[0];
        return *(min(wsktab,wsktab+3));
        //  return *(min(tab,tab+3));
        // return 1.5;
    }
    double docisk_fj () {
        if ((stopa.em)<50
                && (stopa.em)
                && (stopa.em))
            betaj=2/3;
        else cout<<"messagebox"<<endl;
       // if (fcdpodlewki<0.2*fcd) cout<<"messagebox<<endl;
        //  return alfabf()*betaj*f.kl(ktory).fcd;
        return f.kl(ktory).fcd; // wyjœcie standardowe
    }
};


int main() {

    przekroj I{450,190,9.4,14.7,18,49.1};
    wymiaryblacha bl{480,220,10};
    wymiarystopa st{500,1000,1000,100,100,30};
    materialblacha fb {235};
    blachaPodstawy wymir (bl,fb,I,"C25/30",st);

    BetonWlasciwosci aaa;

    fo(aaa.kl(3).fcd*0.667*1.67);
    fo(aaa.kl("C25/30").fcd*0.667*1.67);

    fo(wymir.maksymalnyWsieg_C());
    fo(wymir.docisk_fj());
    fo(wymir.alfabf());
    fo(wymir.bcp());
    fo(wymir.hcp());
    fo(wymir.l_cp());
    fo(wymir.nosnosRownyDocisk()/1000.0);


    return 0;
}

 

Podobne pytania

0 głosów
1 odpowiedź 142 wizyt
pytanie zadane 17 sierpnia 2020 w HTML i CSS przez hoostel Nowicjusz (140 p.)
0 głosów
1 odpowiedź 91 wizyt
pytanie zadane 21 marca 2020 w Sieci komputerowe, internet przez Michalecekxd Użytkownik (830 p.)
0 głosów
1 odpowiedź 914 wizyt
pytanie zadane 3 kwietnia 2018 w PHP przez Q7V Gaduła (4,250 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...