Struct vs. class – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Struct vs. class – C / C++ – Fórum – Programujte.comStruct vs. class – C / C++ – Fórum – Programujte.com

 

1. 10. 2006   #1
-
0
-

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++.

Nahlásit jako SPAM
IP: ...–
char zz = 167; cout << "Jak jde " << zz << "ivot?\n";
Michal Prist0
Návštěvník
1. 10. 2006   #2
-
0
-

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

Nahlásit jako SPAM
IP: ...–
Jura_0
Stálý člen
1. 10. 2006   #3
-
0
-

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.?

Nahlásit jako SPAM
IP: ...–
1. 10. 2006   #4
-
0
-

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.

Nahlásit jako SPAM
IP: ...–
char zz = 167; cout << "Jak jde " << zz << "ivot?\n";
Jura_0
Stálý člen
1. 10. 2006   #5
-
0
-

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.

Nahlásit jako SPAM
IP: ...–
Matěj Pácha0
Super člen
7. 10. 2006   #6
-
0
-

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

Nahlásit jako SPAM
IP: ...–
Ajem tíčr, andrgraund tíčr!
Meneltharion0
Návštěvník
7. 10. 2006   #7
-
0
-

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

Nahlásit jako SPAM
IP: ...–
Matěj Pácha0
Super člen
7. 10. 2006   #8
-
0
-

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...

Nahlásit jako SPAM
IP: ...–
Ajem tíčr, andrgraund tíčr!
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 21 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý