Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: použití definovaných operátorů třídy v podtřídě ? je to možné ?

Aktivity
Avatar
Luboš Horký:28.7.2020 10:51

Ahoj,
už v několika programech, kde se učím objektové programování jsem přemýšlel zda by šlo nějakým způsobem lépe porovnat 2 třídy, které jsou propojeny (jedna třída je nad druhou).
Protože pokud si definuji operátor, který v tomhle případě hledá stejný objekt, tak mi přijde zbytečné si hledání a porovnávání složek objektu znovu definovat v podtřídě.

Vše je viditelné v přiloženém kódu, porovnání a nalezení zde funguje jen mi to přijde zbytečně složité a roztahané. Díky za každou radu :)

Zkusil jsem: Hlavičkové soubory:

CAuto.h

#pragma once
#pragma warning(disable : 4996)
#include <iostream>
#include<vector>

using namespace std;

class CAuto
{
private:
        char m_Vyrobce[50];
        int m_Vykon;
        char m_Motor[50];

public:
        void Set(char *vyrobce, int vykon, char *motor);
        bool operator==(CAuto druhy);
        bool operator<(int v);
        CAuto(char* vyrobce, int vykon, char* motor);
        char* GetVyrobce();
        char* GetMotor();
        int GetVykon();
};

CSeznam.h

#pragma once
#include "CAuto.h"
class CSeznam

{
private:
        vector <CAuto*> S_AUTA;

public:
        void PridejAuto(const char* Vyrobce, const char* Motor, int vykon);
        void NajdiAuto(const char* Vyrobce, int vykon, const char* Motor);
        void NajdiAutoDleVyrobce(const char* Vyrobce);
        void NajdiAutoDleVykonu(int vykon);
};

Zdrojáky:

CAuto.cpp

#include "CAuto.h"

void CAuto::Set(char* vyrobce, int vykon, char* motor)
{
        strcpy(m_Vyrobce, vyrobce);
        m_Vykon = vykon;
        strcpy(m_Motor,motor);
}

bool CAuto::operator==(CAuto druhy)
{

        if ((strcmp(druhy.m_Vyrobce, m_Vyrobce) == 0) && (strcmp(druhy.m_Motor, m_Motor) == 0) && (druhy.m_Vykon==m_Vykon))
        {
                return true;
        }
        else
        {
                return false;
        }
}

bool CAuto::operator<(int v)
{
        if (m_Vykon<v)
        {
                return true;
        }
        return false;
}

CAuto::CAuto(char* vyrobce, int vykon, char* motor)
{
        Set(vyrobce, vykon, motor);
}

char* CAuto::GetVyrobce()
{
        return m_Vyrobce;
}

char* CAuto::GetMotor()
{
        return m_Motor;
}

int CAuto::GetVykon()
{
        return m_Vykon;
}

CSeznam.cpp

#include "CSeznam.h"

int p = 0;


void CSeznam::PridejAuto(const char* Vyrobce, const char* Motor, int vykon)
{
        CAuto* AUTO;

        AUTO = new CAuto((char*)Vyrobce, vykon, (char*)Motor);
        S_AUTA.push_back(AUTO);
        p++;
}

void CSeznam::NajdiAuto(const char* Vyrobce, int vykon, const char* Motor)
{
        cout << endl << "Hledani zadaneho auta: " << endl;

        for (int i = 0; i < p; i++)
        {
                if ((strcmp(Vyrobce, S_AUTA[i]->GetVyrobce()) == 0) && (strcmp(Motor, S_AUTA[i]->GetMotor()) == 0) && (vykon == S_AUTA[i]->GetVykon()))
                {
                        cout << "NALEZENE auto: " << S_AUTA[i]->GetVyrobce() << ", " << S_AUTA[i]->GetMotor() << ", " << S_AUTA[i]->GetVykon() << endl;
                }

        }
}

void CSeznam::NajdiAutoDleVyrobce(const char* Vyrobce)
{
        cout << endl << "HLEDANI aut dle Vyrobce: " << Vyrobce << endl;
        for (int i = 0; i < p; i++)
        {
                if ((strcmp(Vyrobce, S_AUTA[i]->GetVyrobce()) == 0))
                {
                        cout << "NALEZENE auta: " << S_AUTA[i]->GetVyrobce() << ", " << S_AUTA[i]->GetMotor() << ", " << S_AUTA[i]->GetVykon() << endl;
                }

        }
}

void CSeznam::NajdiAutoDleVykonu(int vykon)
{
        cout << endl << "HLEDANI aut dle Vykonu: < "<<vykon << endl;
        for (int i = 0; i < p; i++)
        {
                if (S_AUTA[i]->GetVykon() < vykon)
                {
                        cout << "NALEZENE auta: " << S_AUTA[i]->GetVyrobce() << ", " << S_AUTA[i]->GetMotor() << ", " << S_AUTA[i]->GetVykon() << endl;
                }

        }
}

a nakonec Source.cpp

#include "CSeznam.h"

int main()
{
        CSeznam seznam;

        seznam.PridejAuto("Skoda", "1.5TSI", 110);
        seznam.PridejAuto("Skoda", "1.4MPI", 55);
        seznam.PridejAuto("Kia", "1.2TSI", 81);
        seznam.NajdiAuto("Skoda", 110, "1.5TSI");
        seznam.NajdiAutoDleVyrobce("Skoda");
        seznam.NajdiAutoDleVykonu(100);
}

Celý kód je udělán touhle formou protože se jednalo o zadané cvičení a některé funkce byly určené jak mají být předepsané.

Chci docílit: Zajímalo by mě zda exituje nějaký způsob použití již definovaného operátoru třídy v podtřídě.
A využít ho k porovnání objektů.

Zadání dávám v příloze obrázek, ale to není důležité :)

Děkuji za všechny ohlasy :)

Odpovědět
28.7.2020 10:51
Poslední co umírá je naděje.
Avatar
Odpovídá na Luboš Horký
Luboš Horký:28.7.2020 11:34

Ještě takový detail místo počítadla p je asi určitě vhodnější použít

size(S_AUTA)

takže potom by cykly vypadaly takhle:

for (int i = 0; i < size(S_AUTA); i++)
:)
Nahoru Odpovědět
28.7.2020 11:34
Poslední co umírá je naděje.
Avatar
Luboš Horký:28.7.2020 12:38

Možná už jsem našel řešení
použít ukazatel, tam bude asi ta chyba. S ukazatelama neustále svádím boj.

void CSeznam::NajdiAuto(const char* Vyrobce, int vykon, const char* Motor)
{
        cout << endl << "Hledani zadaneho auta: " << endl;

        CAuto pom((char*)Vyrobce, vykon, (char*)Motor);

        for (int i = 0; i < S_AUTA.size(); i++)
        {
                if (*S_AUTA[i]==pom)

                {
                        cout << "NALEZENE auto: " << S_AUTA[i]->GetVyrobce() << ", " << S_AUTA[i]->GetMotor() << ", " << S_AUTA[i]->GetVykon() << endl;
                }

        }
}

Tím by se měl zavolat operator :)

Editováno 28.7.2020 12:40
Akceptované řešení
+5 Zkušeností
Řešení problému
Nahoru Odpovědět
28.7.2020 12:38
Poslední co umírá je naděje.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.