Funkcja biorąca po jednym znaku ze stringa.

0

Witam, z drugiego argumentu chcę mieć pętle, która czyta znak po znaku co jest w tym argumencie, bo przy niektórych literach dodaję do inta wartości.
Robiąc tak:


 char znak;
 
  for(unsigned int i=0; i<strlen(argv[1]); i++)
         {
 
             znak = argv[1].at(i);
 
  ---jeśli jakaś litera == znak to coś się dzieje, ta część już nieważna -- 
 }

wywala mi bład - request for member 'at' in '(argv + 8u)', which is of non-class type 'char'
Może mi ktoś powiedzieć o co chodzi?

4
argv[1]

to jest char*, a nie std::string.

znak == argv[1][i];
2

Poza tym wyrzuć strlen poza warunek (tj. zapisz do zmiennej i w warunku przyrównuj do niej), ponieważ Twój algorytm ma przez to (zbędnie) złożoność kwadratową.

0

Okej, poprawione, a teraz mam pytanie odnośnie obiektów, bo tutaj pracowałem nad mainem tego wszystkiego - mam klasę abstrakcyjną Figura z dwoma metodami abstrakcyjnymi, jest klasa abstrakcyjna Czworokąt, która powinna extendować Figurę co niby zrobiłem przez dodanie ":", natomiast nie wiem jak zrobić żeby była ona też abstrakcyjna, skoro klasa Czworokąt nie ma żadnej metody, więc nigdzie nie mogę dopisać "virtual" i "=0", ma tylko konstruktor. Mogę podesłać kody jak coś jest niezrozumiałe.

2

W takim razie niech destruktor będzie wirtualny.

0

Okej, a czy ja mogę tworzyć tablicę obiektów klasy abstrakcyjnej? Ponieważ gdy mam tą klasę Figura tworzę tablicę tak:

Figura* tab = new Figura[obiekty];

i wyskakuje error: invalid new-expression of abstract class type 'Figura'

3

Jak chcesz tablicę - użyj std::vector. Jeśli chcesz trzymać tam obiekty polimorficzne - trzymaj std::vector<std::unique_ptr<Base>>. Jeśli chodzi o new[], to tak się składa, że ostatnio popełniłem opis, kiedy tego powinno się używać: link (tl;dr: prawie nigdy).

1
rudnev1922 napisał(a):

Okej, a czy ja mogę tworzyć tablicę obiektów klasy abstrakcyjnej? Ponieważ gdy mam tą klasę Figura tworzę tablicę tak:

Figura* tab = new Figura[obiekty];

i wyskakuje error: invalid new-expression of abstract class type 'Figura'

Nie powinieneś tworzyć obiektów klasy abstrakcyjnej. Możesz tworzyć obiekty klasy która po klasie abstrakcyjnej dziedziczy.

0

Muszę podesłać zdjęcie, bo ja już nie wiem co robię źle, zincludowałem bibliotekę memory a deklaracja tej tablicy nadal mi nie działa..

1

**std::**unique_ptr

unique_ptr należy do przestrzeni nazw std.

0

Potrzebujesz minimum C++11, być może musisz to ustawić w ustawieniach projektu. Dodatkowo tak jak @Juhas napisał, std::.

0

Mam to dane na poczatku, w sensie using namespace, a jak dołączam to std:: mimo wszystko to jest napisane że unique_ptr nie zawiera się w 'std'

0

Mam już, musiałem pozmieniać w codeblocksie, natomiast mam kolejny problem (przepraszam za taki spam, ale pisanie w javie dla mnie jest milion razy łatwiejsze) - próbuję dodać na koniec tablicy obiekt Kwadrat który extenduje klasę abstrakcyjną Czworokąt extendującą już wcześniej przytoczoną Figurę.
Wpisuję -

tab.push_back(Kwadrat(a, b, c, d, sinus));

pojawia się komunikat C:\c++\l3z2\main.cpp|99|error: no matching function for call to 'std::vector<std::unique_ptr<Figura> >::push_back(Kwadrat)'|

Jaki może być problem? W konstruktorze tej klasy abstrakcyjnej jest 5 argumentów, konstruktorze Czworokąta to samo i to samo w kwadracie

3
tab.push_back(std::make_unique<Kwadrat>(a, b, c, d, sinus));

Masz tablicę wskaźników, nie możesz tam obiektu przekazać.

0

To w takim razie jak uruchamiam metodę z danego obiektu, który jest zapisany w tej tablicy?

1
tab[n]->foo();

Oczywiście masz dostęp tylko do metod widocznych w interfejsie.

0

Przesyłam główną gałąź tego programu, czy tutaj zgadzają się dziedziczenia, bo myślę że bez tego to ja będę błądził i błądził.. W Figura są 2 konstruktory, bo jeszcze są potem klasy gdzie jest tylko jeden argument potrzebny, a nie 5 jak przy czterokątach.

Figura.cpp

#include "Figura.h"

Figura::Figura(double a, double b, double c, double d, double sinus)
{

}

Figura::Figura(double a)
{

}

Figura::~Figura()
{

}

Figura.h

class Czworokat : public Figura
{
    public:
        Czworokat(double a, double b, double c, double d, double sinus);
        virtual ~Czworokat() = 0;

    protected:
        double a, b, c, d, sinus;

    private:

};

Czworokat.cpp

#include "Czworokat.h"
#include <math.h>

Czworokat::Czworokat(double a, double b, double c, double d, double sinus) : Figura::Figura(a, b, c, d, sinus)
{
    this->a = a;
    this->b = b;
    this->c = c;
    this->d = d;
    sinus = sinus * M_PI / 180;
    this->sinus = sinus;
}

Czworokat::~Czworokat()
{

}

Czworokat.h

class Czworokat : public Figura
{
    public:
        Czworokat(double a, double b, double c, double d, double sinus);
        virtual ~Czworokat() = 0;

    protected:
        double a, b, c, d, sinus;

    private:

};

Kwadrat.cpp

#include "Kwadrat.h"
#include <math.h>
#include "Czworokat.h"

Kwadrat::Kwadrat(double a, double b, double c, double d, double sinus) : Czworokat::Czworokat(a, b, c, d, sinus)
{

}

double Kwadrat::obwod()
{
    double obwod = 4*a;
    return obwod;
}

double Kwadrat::pole()
{
    double pole = pow(a,2);
    return pole;
}

Kwadrat::~Kwadrat()
{
}

Kwadrat.h

#include "Kwadrat.h"
#include <math.h>
#include "Czworokat.h"

Kwadrat::Kwadrat(double a, double b, double c, double d, double sinus) : Czworokat::Czworokat(a, b, c, d, sinus)
{

}

double Kwadrat::obwod()
{
    double obwod = 4*a;
    return obwod;
}

double Kwadrat::pole()
{
    double pole = pow(a,2);
    return pole;
}

Kwadrat::~Kwadrat()
{
}
1

Trochę to bezsensowne. Czemu Kwadrat wymaga pięciu argumentów? Co one oznaczają? Wykorzystujesz tylko a. Analogicznie, po co pięcioargumentowy konstruktor w Figura? Nie musisz przecież wszystkich argumentów przekazywać do klasy nadrzędnej.

0

Wymaga pięciu, bo każda klasa extendująca Czworokąt potrzebuje pięciu - cztery boki i kąt (nie wiem czemu nazwałem to sinus). Musimy mieć cztery boki bo tak było w poleceniu, sam bym zapisał to dwoma bokami, no ale najwidoczniej musimy posprawdzać przypadki odpowiednie. A w Figura w javie mam pusty konstruktor jak chodzi o argumenty, tutaj już się pogubiłem co robię - głównie chodzi o to, że gdy robiłem w Czworokącie konstruktor to wydawało mi się że musi mieć tyle samo argumentów to co przed dwukropkiem i to co po (chodzi mi o Czworokat.cpp 4 linijka). Także co ja mam zrobić żebym miał pewność, że tworząc obiekt Kwadrat wszystko stworzy mi się poprawnie?

3

Twoje podejście w ogóle nie ma sensu.
Co gdybyś miał nagle potrzebę stworzenia dwustukąta?

W Twojej klasie Figura powinny widnieć tylko dwie abstrakcyjne metody: getArea oraz getPerimeter, a ich implementacje powinny być zawarte w klasach dziedziczących po niej.

2

To co piszesz nie jest w żadnym stopniu argumentacją. Przemyśl następującą hierarchię:

struct Figura
{
    virtual double obwod() const =0;
};

struct Czworokat : Figura
{
    Czworokat(double bok_a, double bok_b, double bok_c, double bok_d, double kat):
        bok_a{bok_a}, bok_b{bok_b}, bok_c{bok_c}, bok_d{bok_d}, kat{kat}
    {}

    double obwod() const override {
        return bok_a + bok_b + bok_c + bok_d;
    }
    
    double bok_a, bok_b, bok_c, bok_d, kat;
};

struct Kwadrat : Czworokat
{
    Kwadrat(double bok, double kat) : Czworokat(bok, bok, bok, bok, kat) {}
    
    double obwod() const override {
        return 4 * bok_a;
    }
};

Dodatkowe pytania: o co chodzi z kątem? Nie lepiej traktować figury jako zamknięty zestaw punktów na płaszczyźnie?

0

Jeśli to jest romb, to muszę obliczyć pole ze wzoru a^2*sin(sinus) (ah to moje oznaczenie :P), dlatego w konstruktorze Czworokąta zamieniłem sobie już stopnie na radiany, ale pewnie lepiej jak to zrobię w konstruktorze Rombu? Jak wrócę wieczorem z uczelni to poanalizuję te kody powyżej.

0

Ale w takim razie kąt jest cechą rombu, a nie każdego wielokąta. To co teraz widać dużo bardziej wygląda jak obrót wokół środka układu współrzędnych.

0

Nie rozumiem za bardzo co się dzieje w konstruktorze w Czworokącie z tymi bokami i czemu jest we Figurze w metodzie dodane constans.

0

bok_a{bok_a} - inicjalizujesz element bok_a parametrem konstruktora o nazwie bok_a. Analogicznie dla pozostałych boków. bok_a wewnątrz klamerek to parameter, a to na zewnątrz to element klasy. Może to będzie klarowniejsze:

struct foo
{
    foo(int bar) qux{bar} {}
    int qux;
};

Metoda obwod jest const, ponieważ liczenie obwodu w żaden powód nie powinno modyfikować figury.

0

Przepraszam, ale nie rozumiem totalnie co tutaj się dzieje, chociażby dlaczego jest tutaj działanie na strukturach a nie na klasach, czy mógłbym dostać odpowiedź co ja mam w tym swoim kodzie zmienić jak zrobić te dziedziczenia, konstruktory i parametry przy nich? Teraz próbowałem importować pliki i je extendować po prostu prosto z javy zmieniając tylko niektóre rzeczy jak : zamiast extends, ale nadal wywala mi błędy. Najbardziej tutaj nie rozumiem że w mainie odpalając z tamtymi kodami co zapodałem, pojawia się komunikat że nastąpiła wiele razy deklaracja a to Figury a to Czworokąta.. Już naprawdę nie wiem co ja mam w tym kodzie zmieniać.

0

C++ nie ma struktur tak jak C. Jedyna różnica między klasami zdefiniowanymi za pomocą słowa kluczowego class i struct to domyślny poziom dostępu (private vs public).

Dostałeś dobry przykład. Jak wolisz się bawić w programowanie na ślepo metodą losowego wstawiania kodu to obawiam się, że nie mogę Ci pomóc.

0
pojawia się komunikat że nastąpiła wiele razy deklaracja a to Figury a to Czworokąta.
Ustaw guardy w plikach nagłówkowych: ```cpp #pragma once // tutaj kod

// lub

#ifndef tutaj_nazwa
#define tutaj nazwa
//tutaj kod
#endif

2
rekin napisał(a):

Że niby czego nie ma w c++ co jest c?

  1. VLA
  2. nazwane argumenty początkowe
  3. tablice nieokreślonej długości jako elementy składowe structów
  4. goto przestakujące nad inicjalizacją zmiennej
  5. deklaracja enumów czy structów wewnątrz deklaracji funkcji
  6. parę rzutowań ignorujących consty
  7. i jak już o constach mowa, to jeszcze niezainicjalizowane consty
  8. takie ciućki, nie wiem jak je nazwać: int f(int t[const]); (chodzi o tego consta znowu, takie prawie-że traity)

Jeszcze pewnie inne rzeczy, ale że C używam od wielkiego dzwonu, to nie bardzo kojarzę.

2
rekin napisał(a):

Że niby czego nie ma w c++ co jest c?

int class;

:-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1