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

Problem z kodem źródłowym (Program Szyfrujący w kodzie ACII Obiektowo)

Object Storage Arubacloud
0 głosów
218 wizyt
pytanie zadane 21 czerwca 2019 w C i C++ przez KotLuminos Początkujący (270 p.)

Witam :D Pisze program który (narazie) ma szyfrować mi w kodzie ASCII oto on:

Plik .h:

#include <iostream>
#include <sstream>
#include <stdlib.h>
#include <vector>
#include <algorithm>

using namespace std;

class Szyfrowanie
{
private:
    string napis;
    string *szyfr;
    int wybor,ile,dlugosc;
public:
    Szyfrowanie(string = "a",string = nullptr,int = 3,int = 1,int = 1);
    string *szyfrowanie();
    ~Szyfrowanie();
};

Plik .cpp:

#include <iostream>
#include <sstream>
#include <stdlib.h>
#include <vector>
#include <algorithm>
#include "Szyfrowanie_i_Deszyfrowanie.h"

using namespace std;

Szyfrowanie::Szyfrowanie(string n,string sz,int il,int d)
{
    napis = n;
    il = ile;
    dlugosc = dl;
    szyfr = new string [dlugosc];
}

string *Szyfrowanie::szyfrowanie()
{
    switch(wybor)
    {
        case 1:
        {
            for(auto i = napis.begin; i != napis.end; i++)
            {
                *szyfr = static_cast<int>(*i)+ile;
                szyfr++;
            }
        }
        break;
    }
    return szyfr;
}

Szyfrowanie::~Szyfrowanie()
{
    delete [] szyfr;
}

Niestety nierozumie błędów jaki mi pokazuje:

W pliku .h :

linijka 9 D:\Code Blocks\Szyfrowanie_i_Deszyfrowanie_Obiektowo_2.0\Szyfrowanie_i_Deszyfrowanie.h|9|error: candidates are: Szyfrowanie::Szyfrowanie(const Szyfrowanie&)|

Linijka 16: D:\Code Blocks\Szyfrowanie_i_Deszyfrowanie_Obiektowo_2.0\Szyfrowanie_i_Deszyfrowanie.h|16|error:                 Szyfrowanie::Szyfrowanie(std::__cxx11::string, std::__cxx11::string, int, int, int)|

W pliku .cpp:

linijka 10:D:\Code Blocks\Szyfrowanie_i_Deszyfrowanie_Obiektowo_2.0\Szyfrowanie_i_Deszyfrowanie .cpp|10|error: prototype for 'Szyfrowanie::Szyfrowanie(std::__cxx11::string, std::__cxx11::string, int, int)' does not match any in class 'Szyfrowanie'|

Linija 24:D:\Code Blocks\Szyfrowanie_i_Deszyfrowanie_Obiektowo_2.0\Szyfrowanie_i_Deszyfrowanie .cpp|24|error: unable to deduce 'auto' from '((Szyfrowanie*)this)->Szyfrowanie::napis.std::__cxx11::basic_string<char>::begin'|

 

Kompilator obsługuje standardy C++11

1 odpowiedź

0 głosów
odpowiedź 21 czerwca 2019 przez adrian17 Ekspert (344,860 p.)
- nie zgadzają się argumenty konstruktora Szyfrowanie (liczba argumentów)

- napis.begin, napis.end to metody, nie pola

Boczne uwagi:

- próba inicjalizowania stringa nullptr-em to bardzo słaby pomysł

- rekomenduję wpisywanie nazw argumentów w deklaracji funkcji
komentarz 21 czerwca 2019 przez KotLuminos Początkujący (270 p.)

Ok...Zapomniałem że mam poprawiony kod.Oto on:

Plik .h

#include <iostream>
#include <sstream>
#include <stdlib.h>
#include <vector>
#include <algorithm>

using namespace std;

class Szyfrowanie
{
    string napis;
    string *szyfr;
    int wybor,ile,dlugosc;
public:
    friend void menu(Szyfrowanie sz);
    Szyfrowanie(string = "a",string = nullptr,int = 3,int = 1,int = 1);
    string *szyfrowanie();
    ~Szyfrowanie();
};
class Deszyfrowanie
{
    
};

plik cpp:

#include <iostream>
#include <sstream>
#include <stdlib.h>
#include <vector>
#include <algorithm>
#include "Szyfrowanie_i_Deszyfrowanie.h"

using namespace std;

Szyfrowanie::Szyfrowanie(string n,string sz,int w,int il,int d)
{
    napis = n;
    wybor = w;
    il = ile;
    dlugosc = d;
    szyfr = new string [dlugosc];
}

string *Szyfrowanie::szyfrowanie()
{
    switch(wybor)
    {
        case 1:
        {
            for(int i = 0; i < dlugosc; i++)
            {
                *szyfr = ((int)napis[i]+ ile);
                szyfr++;
            }
        }
        break;
    }
    return szyfr;
}

Szyfrowanie::~Szyfrowanie()
{
    delete [] szyfr;
}

Używam tutaj zaprzyjaźnienia gdyż:

class Deszyfrowanie

będzie klasa Deszyfrowanie i choć możne to być ze idę naokoło ale chcę poćwiczyć i chcę zmienić mój program z techniki proceduralnej na obiektowy.Mógłbym to wszystko dać w jednej klasie ale wolo zrobić tak żeby ewentualnie łatwiej mi było coś zmienić/dodać.

void menu(Szyfrowanie sz)
{
    cout << endl<< "Podaj ci¹g znaków:";
    cin >> sz.napis;
    cout << endl << "Podaj ilosc przesuniec:";
    cin >> sz.ile;
    sz.dlugosc = sz.napis.length();
    cout << "--------------------" << endl;
    cout << "1.Szyfrowanie" << endl;
    cout << "2.Deszyfrowanie" << endl;
    cout << "3.Wyjscie" << endl;
    cout << "--------------------" << endl;
    cin >> sz.wybor;
}

Tutaj jest funkcja zaprzyjaźniona i wiej jest zmienna wybór która jak da się 1 to mi w tedy uruchomi program i choć funkcja będzie wywołana to się niewykonań bo wybór != 1 (taki pomysł miałem i w jednym programie zadziało)

szyfr++;

z Lekcji o Wskaźnikach zrozumaiłem że jeśli da się wskaźnik++ to w tedy indeks szuflatki zmiani się o 1 i tak zostanie użyta dynamiczna alokacja pamięci.

Jeśli to coś szyfruje, to gdzie jest argument? Jeśli jedyna funkcja w klasie nie ma argumentów, to równie dobrze to wszystko mogłaby być jedna funkcja; nie jest tu używane nigdzie, że to jest klasa.

Z tego co się dowiedziałem z lekcji o klasach to metoda klasy nie musi mieć argumentów (z tego co widziałem)gdyż używa atrybutów klasy,ale może jednak w niektórych programach tak trzeba

Ogólnie wiem ze program idzie naokoło ale chcę poćwiczyć sobie i zmienić program Szyfrujący i Deszyfrujący z proceduralnego na Obiektowy.

komentarz 21 czerwca 2019 przez adrian17 Ekspert (344,860 p.)

z Lekcji o Wskaźnikach zrozumaiłem że jeśli da się wskaźnik++ to w tedy indeks szuflatki zmiani się o 1 i tak zostanie użyta dynamiczna alokacja pamięci.

Trzeci raz wspominasz dynamiczną alokację pamięci jakby to było wyjaśnienie, ale ten kod wciąż jest tak samo błędny jak był :/

I wciąż nie rozumiem, jaka jest w ogóle idea tego szyfrowania, bo z tego kodu nie potrafię wywnioskować algorytmu.

ale chcę poćwiczyć i chcę zmienić mój program z techniki proceduralnej na obiektowy

Super... to informuję Cię, że to tak nie wygląda "technika obiektowa". To, że część kodu jest teraz w klasach, nie oznacza, że to jest dobre i rozsądne użycie klas.

Tutaj jest funkcja zaprzyjaźniona i wiej jest zmienna wybór która jak da się 1 to mi w tedy uruchomi program i choć funkcja będzie wywołana to się niewykonań bo wybór != 1 (taki pomysł miałem i w jednym programie zadziało)

To jest dokładnie odwrotne do właściwego podejście do odpowiedzialności klasy. Zadaniem klasy szyfrującej ma być szyfrowanie. Po co ma ją interesować jakiś interfejs i wybory? Powinno być na odwrót. Jak programista pisze `szyfruj()`, to dlatego że chce żeby coś zostało zaszyfrowane, a nie żeby funkcja zdecydowała czy jej się chce.

Z tego co się dowiedziałem z lekcji o klasach to metoda klasy nie musi mieć argumentów (z tego co widziałem)gdyż używa atrybutów klasy,ale może jednak w niektórych programach tak trzeba

To nie zależy od programu, tylko od tego jak powinna wyglądać logika.

Dobra, dam uproszczony przykład jak by to mogło wyglądać z dość rozsądnym podejściem obiektowym:

int key = 123;
Encrypter encrypter(key);

std::string a = encrypter.encrypt("sekret1");
std::string b = encrypter.encrypt("sekret2");

Decrypter decrypter(key);

std::string x = decrypter.decrypt(a); // x == "sekret1"
std::string y = decrypter.decrypt(b); // y == "sekret2"

 

komentarz 21 czerwca 2019 przez KotLuminos Początkujący (270 p.)

Dziękuje za odwiedź :D Widać zrobiłem dużo błędów....usunę program i zacznę jutro od nowa ;)

Bardzo dziękuje za konstruktywna krytykę :D

To nie zależy od programu, tylko od tego jak powinna wyglądać logika

Nierozumieniem o co tutaj chodzi...o co chodzi z ta logiką?

 

komentarz 21 czerwca 2019 przez adrian17 Ekspert (344,860 p.)

Nawiązałem do tego:

Z tego co się dowiedziałem z lekcji o klasach to metoda klasy nie musi mieć argumentów (z tego co widziałem)gdyż używa atrybutów klasy,ale może jednak w niektórych programach tak trzeba

To technicznie jest prawda, ale niewiele mówi, podobnie jak... um, szukam porównania... "nie każde biurko musi mieć rzeczy na wierzchu, gdyż trzymasz rzeczy w szufladach". Może słabe porównanie ;)

W każdym razie tutaj raczej na intuicję metoda powinna mieć argument. Wywołując szyfruj() prosisz o zaszyfrowanie rzeczy. Jakiej? To powinno być przekazane jako argument.

komentarz 21 czerwca 2019 przez KotLuminos Początkujący (270 p.)
Aaaaa rozumiem dziękuje ;) Nie dziwie się że masz rangę Mędrzec ;)

Podobne pytania

0 głosów
1 odpowiedź 286 wizyt
–2 głosów
3 odpowiedzi 2,550 wizyt
pytanie zadane 21 stycznia 2019 w C i C++ przez HaSen Nowicjusz (230 p.)

92,576 zapytań

141,425 odpowiedzi

319,650 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!

...