• 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)

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
381 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 Mentor (354,120 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 Mentor (354,120 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 Mentor (354,120 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ź 535 wizyt
–2 głosów
3 odpowiedzi 2,924 wizyt
pytanie zadane 21 stycznia 2019 w C i C++ przez HaSen Nowicjusz (230 p.)

93,440 zapytań

142,431 odpowiedzi

322,679 komentarzy

62,802 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

...