Tady v kurzu C++ se učí struct ale struct je vlastě spíš součást jazyka C ne? Já mam knihu Naučte se C++ za 21 dní a tam se normálně učí class. Mam 2 otázky: Jakej je vlastě mezi tím rozdíl a proč se v kurzu C++ neučí class i když to je vlastně jedna z velkých novinek OOP C++.
Fórum › C / C++
Struct vs. class
moje vedomosti ohladom c++ su dost slabe ale pokial viem tak struktura je datovy typ ktory "v sebe obsahuje" premenne roznych typov. trieda je o niecom inom. v triede pouzivat funkcie a mozes rozdelovat na public a private.
kde private nemozes zmenit inak ako funkciou definovanou v tejto triede.
ak hovorim blbosti tak sorry ale s c++ robim priblizne mesiac mozno 2.:D
Cubche napsal:
Tady v kurzu C++ se u?? struct ale struct je vlast? sp?? sou??st jazyka C ne? J? mam knihu Nau?te se C++ za 21 dn? a tam se norm?ln? u?? class. Mam 2 ot?zky: Jakej je vlast? mezi t?m rozd?l a pro? se v kurzu C++ neu?? class i kdy? to je vlastn? jedna z velk?ch novinek OOP C++.
Jediny rozdil mezi class a struct v C++ je ten, ze struct ma vsechny sve cleny implicitne verejne, kdezto trida je ma privatni. Cili zapis:
struct A
{
int a;
};
class A
{
public:
int a;
};
Jsou funkcne naprosto totozne.?
Takže v struct nejde napsat
struct A
{
public:
int c;
private:
int d;
};
??
Jo a ještě jedna otázka má struct dedičnost?? Myslím tim napr. tento kód:
class A
{
public:
int w;
private
int q;
}
class B : public A
{
public:
int u;
private:
int i;
}
Právě že struct v C tohleto asi neměly protože dedičnost je OOP.
Cubche napsal:
Tak?e v struct nejde napsat
struct A
{
public:
int c;
private:
int d;
};
??
Jo a je?t? jedna ot?zka m? struct dedi?nost?? Mysl? tim napr. tento k?d:
class A
{
public:
int w;
private
int q;
}
class B : public A
{
public:
int u;
private:
int i;
}
Pr?v? ?e struct v C tohleto asi nem?ly proto?e dedi?nost je OOP.
Pokud se bavime o C++:
Jisteze jde, struct je v podstate trida, akorat ma tu vlastnost, ze vsechny atributy, ktere do ni napisete jsou public(pokud ovsem neudate jinak).
Cili prikald znova - oba kody jsou si funkcne identicke:
struct A | class A
{ | {
// a j public | public:
int a | int a; // a je public
private: | private:
// b je private |
int b; | int b; // b je private
}; | };
?
pokud o C:
Tak struct v podstate slouzi jen k jakemusi zaobaleni promennych, dava jim namespace - v jednom zdrojaku muzou existovat promenne se stejnym identifikatorem(samozrejme to neplati o lakalnich prom.), ale musi byt v odlisne nazvanych struktur.Tecka. Tohle je ovsem jen na okraj.
Nechtělo se mi zakládat nový topic, tak to píšu sem:
Hodilo by se mi použít strukturu k uchování dat včetně popisu. Struktura by měla být členem třídy (je to složený datový typ a nikde jsem nenašel, že třída nemůže obsahovat strukturu) a dokonce by se mi hodilo dynamické pole struktur. Zkoušel jsem následující kód:
#include "stdafx.h"
#include <iostream>
using namespace System;
using namespace std;
//šablona struktury parametru
struct Sparam
{
double value;
char name[10];
};
//Třída parametr§
class CParametry
{
private:
Sparam *param;
int imax;
public:
CParametry();
CParametry(int a);
CParametry(double val, int a);
~CParametry();
void Napln(double val, int a);
void Ukaz();
};
//1. Konstruktor třídy CParametry
CParametry::CParametry()
{
Sparam param = new Sparam; //Hlásí chybu !!!
imax = 1;
}
//2. Konstruktor třídy CParametry
CParametry::CParametry(int a)
{
Sparam param = new Sparam [a]; //Hlásí chybu !!!
imax = a;
}
//Destruktor
CParametry::~CParametry()
{
delete param;
}
//2. Naplneni parametru
void CParametry::Napln(double val, int a)
{
if(a > imax)
return;
param[a].value = val;
}
//Zobrazení hodnot parametrů
void CParametry::Ukaz()
{
cout << "Vypis parametru:n";
for(int i_ = 0; i_ <= imax; i_++)
cout << param[i_].name << "t" << param[i_].value << "n";
cout << "********************************n";
}
//**********************************************************************
int main(array<System::String ^> ^args)
{
CParametry p = CParametry::CParametry();
Console::WriteLine(L"Hello World");
return 0;
}
Na označených místech mi to hází chybu "cannot convert from 'Sparam *' to 'Sparam' ", čemuž rozumím, ale chci se zeptat, jestli mám hledat dál, nebo bojuju s větrným mlýnem....
Díííky
No tak zaprvé bych asi doporučil použít pro tyto účely nějakou hotovou třídu určenou k ukládání mnoha proměnných. Např. std::vector. Případně si od této třídy odvodit svoji třídu.
Jinak jsem letmým prolétnutím kódu našel hned 3 chyby:
1) V konstruktorech špatně přiřazuješ adresu proměnné (tu, kterou vrací operátor new) obyčejně proměnné (ne ukazateli). Správně by mělo být
Sparam * param = new Sparam;
(nevytváříme proměnnou, ale ukazatel na proměnnou), ALE
2) Ukazatel s názvem param m?? už v definici třídy, takže v konstruktorech bys další proměnné už vytvářet neměl, ale měl bys přiřadit adresu existujícímu ukazateli. Neboli, místo
Sparam param = new Sparam;
by mělo být jen param = new Sparam;
3) V jednom konstruktoru alokuješ operátorem new jednoduchou proměnnou, v druhém pole. To je špatně třeba kvůli tomu, že pokud alokuješ pole např. takto:
param = new Sparam [4];
a potom se potom pokusíš paměť uvolnit takto:
delete param; // správně má být delete [] param;
výsledek nebude definován (stane se nějaká blbost).
Díky moc! Funguje to. Nechci si zatím život komplikovat učením složitějších postupů OOP, protože mám málo času. Hlavním zdrojem informací je Mistrovství v C++, ale to není kuchařka (kterou potřebuji), ale seriózní učebnice a na to teď opravdu čas nemám...
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Class nebo struct ? — založil Kenvelo
Aplikace Sklad, použít pro zboží struct, nebo class? — založil ondrej39
Rozdil mezi Class a public class ??? — založil Luk4Senko
Class pointer v jiné class — založil Hunty
Moderátoři diskuze