C++ -ban, miket is írunk a forrásokhoz tartozó .h fájlba?
2018-05-02T00:13:51+02:00
2018-05-03T16:22:07+02:00
2022-07-21T06:18:29+02:00
  • És a {""} részt láttad-e?

    Ott egy const char[1] tipussal inicializalt volna egy std::string* tipust, persze akarni lehet, hogy 100 elemu tombbot akart volna.
    Mutasd a teljes hozzászólást!
  • Nem, éppenséggel több platformot is támogat a .NET, de amíg csak gyakorolsz szerintem lényegtelen, hogy milyen platformokat tud még. Egyelőre úgyis winen gyakorolsz.
    Mutasd a teljes hozzászólást!
  • Százelemű tömböt amúgy sem lehetne egy elemmel inicializálni.

    Nem is volt a kodjaban olyan resz ahol egy elemmel akarta volna inicializalni a 100 elemu tombot.

    És a {""} részt láttad-e?
    Mutasd a teljes hozzászólást!
  • én ezt értem, de mondjuk ha írnék egy számológépet, ami ilyen GUI-t használna, csak windowson tudna futni... ez a bajom vele, csak.
    Mutasd a teljes hozzászólást!
  • Kezdetnek a C# is teljesen jó. Ha BIOS-t nem is, de már 3D engine-t írtak vele. A C++ t elég akkor elővenni, mikor már olyanoknál tartasz, hogy a memória kezelést is optimalizálod, meg ilyen finomságok.
    Mutasd a teljes hozzászólást!
  • enum UserTypes
    helyett nézz utána az 'enum class'-nak.

    this->userType = ut;
    A 'this' fölösleges, szerintem ha nem muszáj fölöslegesen ne gépelj.

    string properties[100]
    C++-ban vannak könnyen kezelhető containerek. 'std::vector<string>' kényelmesebb minden szempontból.

    length
    C++-ban az STL a 'size()'-t használja. Célszerű STL kompatibilis interfészt használni. sima array-nek meg nincs length-e.

    UserType.Admin
    Már írták, 'UserTypes::Admin' helyesen.

    using namespace std;
    Headerben nem húzunk be namespace-eket, mert hosszútávon csak megszívatjuk vele magunkat.

    #pragma once
    Nem standard 'C++'.
    Mutasd a teljes hozzászólást!
  • Százelemű tömböt amúgy sem lehetne egy elemmel inicializálni.

    Nem is volt a kodjaban olyan resz ahol egy elemmel akarta volna inicializalni a 100 elemu tombot.
    Mutasd a teljes hozzászólást!
  • tudom, azzal is próbálkozok, sokkal szívesebben használnám azt, de

    mondjuk az tud futni linuxon, vagy bárhol úgy mint a C++, wine használata nélkül? azt tudom, hogy a biosok, meg ilyen hasonlók is általában cpp-ben, és c-ben íródnak, a c# erre is képes lenne?
    Mutasd a teljes hozzászólást!
  • A C-be is, mentségükre szóljon... a mem*_s függvényeket például Ifjabb Vér István személyesen alkotta meg.
    Mutasd a teljes hozzászólást!
  • És amennyire eszetlenségeket fejlesztenek a c++-ba

    Például?
    Mutasd a teljes hozzászólást!
  • Ha hibát keresel, talán kicsit informálisabb reakciót is adhatnál, mint "nem megy". Például hogy mivel fordítasz (!), hogy tényleg elkövetted-e a javasolt módosításokat, és hogy milyen hibát kapsz (fordításkori, vagy run-time).

    És igen, akad pár olyan tisztázatlan kérdés, mint például érted-e, mit jelent a bepéldányosítás, hogy miért kell az, hogy az adataidnak hogyan zajlik a memória foglalás, és mi szabadítja majd fel a lefoglalt memóriát, de azokat majd sorjában. Előbb értsd meg, mi a probléma, és majd utána ki is javítod.

    Ha egyszerűbbet akarsz, nem jó ötlet a c++. Inkább .net c#-al kezdj. Az sokkal kényelmesebb. A c++ ahhoz képest spártai. Az egyszerűséget felejtsd is el. Hozzáállás szintjén is elvi hiba. Ha c++-ra adnád a fejed, apró részletekig bonyolult dolgokkal fogsz együtt élni. Legelsőként talán ezt a kérdést emészd meg, és ha nem tetszik, akkor még most felejtsd el a c++-t.
    Mutasd a teljes hozzászólást!
  • Teljesen halott a kódod, egy fájlba összemásolva se működne.
    Konkrétan az enum a legkisebb probléma, UserType.Admin helyett UserTypes::Admin-t vagy csak simán Admin-t kéne írnod.
    De egy akármi[100] tömbnek C/C++-ban nincs length tagváltozója, kezdve azzal, hogy a tömb ezekben a nyelvekben nem is objektum. Százelemű tömböt amúgy sem lehetne egy elemmel inicializálni.
    Mutasd a teljes hozzászólást!
  • értem mire gondolsz, de ennél nincs egyszerűbb?
    csak mert átraktam az enumot a header-be, de még így se jó. márha így működnie kéne.
    Mutasd a teljes hozzászólást!
  • A C++ nyelv c. könyvből idézve:

    Alapszabályként fogadjuk el, hogy egy fejállományban a következõk szerepelhetnek:

    Nevesített névterek namespace N { /* … */ } Típusdefiníciók struct Point { int x, y; }; Sablondeklarációk template<class T> class Z; Sablondefiníciók template<class T> class V { /* … */ }; Függvénydeklarációk extern int strlen(const char*); Helyben kifejtett függvények definíciói inline char get(char* p) { return *p++; } Adatdeklarációk extern int a; Konstansdefiníciók const float pi = 3.141593; Felsorolások enum Light { red, yellow, green }; Névdeklarációk class Matrix; Beépítõ utasítások #include <algorithm> Makródefiníciók #define VERSION 12 Feltételes fordítási utasítások #ifdef __cplusplus Megjegyzések /* check for end of file */

    Ezeket próbáld. using namespace-t például ne, mert azzal feloldasz minden h-ban és cpp-ben is, ahova behúzod közvetve, vagy közvetlenül.
    Aztán majd jönnek a modulok ott meg már egyre kevésbé játszik majd a header-özés.
    Mutasd a teljes hozzászólást!
  • Nem is a semmiért nem tűnt még el a c  És amennyire eszetlenségeket fejlesztenek a c++-ba, szerintem már nem is fog eltűnni.

    De főleg azért is javasoltam, mert a pointer-eket a void*-al lehet legkönnyebben megérteni. Ha azt valaki átugorja, akkor a halom sok typedef-el a típushibák közepette szerintem be fog pöccenni  És persze az #ifdef-hez is hozzá kell szokni.
    Mutasd a teljes hozzászólást!
  • azért ezzel vigyázni kell, ma már jelentős az eltérés a C és C++ között ....

    inkább úgy mondanám, hogy C++--
    Mutasd a teljes hozzászólást!
  • Mielőtt c++-ra adnád a fejed, előbb a c-t kellene gyakorolni picit. Ott sokkal könnyebb megérteni a pointer-eket és a header-eket. Tömören: minden a header-be megy, kivéve a végrehajtható kódot, mármint magukat a függvényeket. Header-be megy az összes deklaráció, a változók, a prototípusok, a definíciók, a makrók, a többi header behúzása. Az egyetlen gyakorlat, amit onnét ne vegyél át, az a központi header építése.

    Jelen esetben csak annyit vétettél azzal az enum-al, hogy azt is a User.h-ba kellene rakni, mit keres az a függvényekkel azonos file-ban? Ja, és az a "UserType.Admin" el van írva -> "UserTypes.Admin". A hibaüzeneted jelen esetben azért is érkezik, mert egy nem létező típusra hivatkozol.

    Az jelenleg még csak szépség hiba, hogy ami típusokra / változókra nem csak az adott osztályban hivatkozol, hanem másutt is, azt megfontolandó, hogy átrakod a globálisok közé. Az jellemzően külön header állomány. Mondjuk csinálsz a User.h mellé egy "User_glob.h"-t is, és oda átrakod az enum-odat, a header-t pedig behívod a főprogramba is, meg az adott osztályba is.
    Mutasd a teljes hozzászólást!
  • Én elég rég C++ -oztam, de a konkrét példádban szerintem a UserType definíciója (ami egyben deklaráció is) a header-ben kellene legyen.

    Alapvetően az kerül a header-be,

    a) amit elérhetővé akarsz tenni
    b) amire a fordítónak szüksége van a fordításhoz

    Tehát ha azt akarod, hogy a modulod segítségével más is gyárthasson User objektumot, akkor a "class User" definíciója a header-be kerül. (a pont) Jellemzően az osztály összes metódusa, beleértve a protected/private részeket is, ugyanitt kerül deklarálásra, tehát a header-be kell kerüljön (b pont).

    Arra tudsz gondolni, hogy amikor a fordító egy másik modult fordít, akkor ebből a modulból csak a header információi állnak rendelkezésére. Ezért van a cpp-ben az "include" rész. (Ellentétben pl. egy java fordítóval, ami ilyenkor belenéz a többi forrásba, vagy lefordított .class fájlba). Ha valami csak a .cpp fájlodban van benne, az a többi modul fordításakor nem ismert, tehát a fordító a te esetedhez hasonlóan hibát fog dobni.

    Természetesen a class definiálásához kell a mezők deklarációja. Ezért kell neked a UserType-ot a header-be tenned. Amíg a fordító nem tudja, mekkora helyet foglal egy UserType érték a memóriában, nem tudja, mekkora helyet kell biztosítania egy User osztálynak.

    Hasonlóképp a függvények/metódusok esetén is ismernie kell a paraméterek felépítését, a paraméter-átadáshoz szükséges kód legyártásához. Kivételt képeznek a cím szerint átadott paraméterek. Írhatsz pl. ilyet:

    class A; int x( A & a );
    Ezen a ponton nem kell tudnia a gépnek, hogyan épül fel az A osztály, itt elég annyi, hogy az x függvény egy mutatót kap.

    Ami általában nem kell, hogy a header-be kerüljön, az a függvények törzse. A gépi kódú részeket a gép csak a végén, linkeléskor köti össze, erre a tárgy-objektumok felépítése lehetőséget ad.

    Kivételt képeznek a sablonok (template). Ezen függvények/metódusok törzse szintén a header-be kell kerüljön. Ezeknél csak a példányosításkor készül gépi kód, tehát a többi modulban is szükség van a függvénytörzs ismeretére.

    Amúgy a C++ sokat változik manapság, lehet, hogy amit leírtam, már nem, vagy csak pontosításokkal érvényes.
    Mutasd a teljes hozzászólást!
  • Hali, kicsit utána olvastam, és megtudtam, hogy statikus változókat nem írunk oda meg ilyesmi. Én úgy értelmeztem, lehet rosszul, hogy ebbe a fájlba azt írjuk, amit más fájlokból is el szeretnénk érni, majd a hozzá tartozó C++ fájlban ezeket amiket ott "lefoglaltunk", definiáljuk. De mondjuk itt hogy csinálhatom meg azt, hogy egy másik classban definiált enumot hogy lehet elérni máshonnan? 

    //Main #include "stdafx.h" #include "User.h" int main() { User u(UserType.Admin, {""}); return 0; } //User.cpp #include "stdafx.h" #include "User.h" enum UserTypes { Default, Admin }; User::User(UserTypes ut, string properties[100]) { this->userType = ut; for (int i = 0; i < properties->length; i++) this->properties[i] = properties[i]; } //User.h #pragma once #include <string> using namespace std; class User { public: UserTypes userType; string properties[100]; User(UserTypes ut, string properties[100]); ~User(); };
    Amikor létrehoznám a class instance-t, kiírja, hogy "identifier "UserType" is undefined".
    Illetve én is neten tanultam / tanulgatom, (de sajnos a Ti segítségetek nélkül nem nagyon megy, mert eddig mindent itt értettem meg igazából), de valaki el tudná magyarázni, hogy a .h fájlokba tényleg, miket is írunk?
    Mutasd a teljes hozzászólást!
Címkék
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd