Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[C++] Głupie I Mądre Pytania


Rekomendowane odpowiedzi

Opublikowano

Po kilka plusów i piątki ofkoz za odpowiedzi. (ale pewnie większośc ogarniaczy ma już 5* ode mnie, więc... tylko plusy :P)

 

Minusy za hooki na strcpy i linki do gigabajtowych plików xD

 

Jestem jeszcze trochę słaby w terminologii ale jakoś postaram się wysłowić :]

 

Gdyby ktoś się zastanawiał "lol omfg po co ci to rotlf":

Potrzebne. :P

 

1. Czy jest możliwe stworzyć public obiekt danej klasy, który - przy próbie modyfikacji "bezpośrednio" - zachowywałby starą wartość [ew. kompilator zwracał błąd] ? Możliwa byłaby tylko modyfikacja przez funkcję [ tylo nie typu void ustaw_wartosc(); tylko raczej void skomplikowany_algorytm_ktory_przy_okazji_zmienia_wartosc_tylko_do_odczytu() ]

 

class:FORUM{ 
  public: 
     int tylko_do_odczytu;
     void funkcja(){ 
            tylko_do_odczytu = 155; 
     }
}; 

int main() { 
  FORUM mpc; 
  mpc.funkcja(); 
  mpc.tylko_do_odczytu = 5; //  __zostawienie starej wartosci__ (brak reakcji) [ewentualnie error kompilatora]
  cout << mpc.tylko_do_odczytu; // wyświetla 155
}

 

@EDIT:

W innych słowach (bo strasznie nakomplikowałem):

Czy jest możliwe stworzyć obiektu wewnątrz klasy, który mógłbym odczytywać globalnie, jednak zmieniać tylko za pomocą funkcji przynależnych do klasy?

 

 

 

2. W javascripcie mamy cuś takiego jak type of zwracającą typ danej zmiennej (array, var, node etc.). Czy istnieje podobny keyword / funkcja w c++: zwracająca int, float, char, bool, nazwę klasy etc. ?

 

3. Jeśli nie istnieje, czy jest jakakolwiek możliwość jej napisania? Innymi słowy: czy kompilatora w ogóle obchodzi jak co się nazywa, czy jedyne czym się zajmuje to rezerwowanie odpwiedniej liczby bajtów w pamięci?

 

4. Czy mogę jakiemuś obiekcie w klasie nadać wartość domyślną, a przynajmniej wyzerować tablicę?

 

class:FORUM{ 
  public: 
     int array[50] = {0}; // zwraca oczywiście błąd - zgodnie z tym, co pisze Grębosz w Symfonii
}; 

 

Jeśli nie da się tego zrobić "prosto" (mówiąc prosto mam na myśli powyższy kawałek kodu), czy nie byłoby możliwości wyzerowania tego po zadeklarowaniu ("FORUM mpc;")?

Myślałem o podobnym rozwiązaniu jak przy tablicy. Z tymże, tablica zwraca pointer do pierwszego elementu. Tworząc pętlę ograniczoną przez sizeof() jestem w stanie wyzerować wszystkie komórki pamięci. Jednak dodając +1 do wskaźnika na klasę otrzymuję komórkę już poza tą klasą.

 

FORUM mpc; 

( &mpc+1 > mpc.array[49] ) == true; 

 

To w kwestii zerowania... bardziej jednak zależałoby mi na tej wartóści domyślnej, inicjalizowanej przy każdym dekalrowaniu klasy :] (przez deklarację mam na myśli "FORUM mpc;" - nie wiem czy to poprawne określenie :]).

 

 

 

 

Pozdrawiam i z góry liczę na odpowiedzi!

4ggr35510n

Ta sygnatura jest pusta.

Opublikowano

1. Poczytaj jakiś kurs c++, mi to już z głowy wyleciało, to poszukam :)

2. Oczywiście, że jest. C++ jest bardziej rozbudowany od js... Przed funkcją zamiast "void" piszesz typ jaki ma zwracać, czyli zamiast "void nazwa_funkcji()" piszesz np. "int nazwa_funkcji()". Wtedy zwraca wartość typu int.

3. Istnieje, więc pomińmy

4. Na razie dam ci sposób na wyzerowanie tablicy: robisz pętelkę, ze zmienną "i" (moja ulubiona nazwa zmiennej w pętelkach :D), ustalasz ją na 0, porównujesz do 50 i za każdym razem dodajesz do niej jeden. Później: tablica=0;

 

 

for(int i=0;i<=50;i++) {

tablica=0;

}

 

 

Ad.1. Możesz dać zmienną w klasie do sekcji private i stworzyć funkcje globalne, które ją zwracają...

 

 

class twoja_klasa {

private:

int zmienna=2;

global:

int zwroczmienna()

{

return zmienna;

}

};

 

 

Opublikowano

1. Możesz zrobić coś takiego, że w sekcji private klasy umieszczasz zmienną a w public tworzysz funkcję do jej odczytu:

class Klasa {
 private:
   int zmienna;
 public:
   int czytajzmienna();
   void zmienwartosc(int war);
};

int Klasa::czytajzmienna() {
 return zmienna;
}

void Klasa::zmienwartosc(int war) {
 zmienna = war;
}

 

3. Niestety nie wiem czy istnieje ale dla kompilatora jest to ważne (wie jak konkretną zmienną ma traktować podczas generowania kodu).

4. Wartość domyślną możesz nadać w konstruktorze klasy

class Klasa {
 Klasa(); //konstruktor
 virtual ~Klasa(); //destruktor
 public:
   int zmienna;
};

Klasa::Klasa() {
 zmienna = 0;
}

Klasa~Klasa() {
 //tutaj ewentualnie może zwalniać zaalokowaną pamięć
}

YOU MUST DIE

- Ganon, Koridai

Opublikowano
2. Oczywiście, że jest. C++ jest bardziej rozbudowany od js...
Ale silniej typizowany - stąd moja obawa, że może czegoś takiego nie być (na pewno nie ma w keywordach).

 

I mówiąc "coś takiego" mam na myśli sprawdzaniu typu już stworzonego obiektu (zmiennej) w trakcie wykonywania programu:

 

int liczba; 
float zmiennoprzecinkowa; 
char *znak; 

cout << typ_obiektu(liczba) /* zwróci "INT" lub jakiś identyfikator liczbowy */ << typ_obiektu(zmiennoprzecinkowa); // zwróci "FLOAT"

 

Nie chodziło mi bynajmniej o deklarowanie funkcji różnego typu :P

 

 

- - - - - - - -

 

 

4. Wartość domyślną możesz nadać w konstruktorze

Dzięki!

 

Dokładnie o to chodziło, trochę głupio, bo w kursach i Symfonii całe rozdziałe o tym :] Ale jakoś w rozdziale o klasach to nikt o tym nie wspomniał! :angry:

 

Leci kilka plusów i piąteczki.

Ta sygnatura jest pusta.

Opublikowano

Z tym sprawdzaniem czy liczba to przychodzi do głowy mi tylko biblioteka cctype.

 

I sprawdzasz sobie np

 

if(isdigit(tablica[i]) {
// Cos tam
}

 

Nie czaje o co chodzi ci w pierwszym punkcie.

Funkcją zewnętrzną możesz mieszać w prywatnej sekcji klasy, jeżeli ta funkcja jest zaprzyjaźniona z daną klasą.

 

Jeżeli chcesz sprawdzić jakiś własny typ to możesz do tego użyć dynamic_cast i sprawdzić czy się powiodło.

 

Aha i w konstruktorze używaj listy inicjalizacyjnej a nie tak jak podał mirraseq

 

Klasa::Klasa(): zmienna(0) {}

 

Zamiast tablicy używaj vector'a

RAsfepN.png
Opublikowano

Brak tego "type of" jakoś przebolałem...

 

Ale nie wierzę, żeby nie było sposobu na osiągnięcie tego, o co mi idzie w punkcie pierwszym.

 

Może na przykładzie ( który pokazuje, że to jest możliwe ):

 

Korzystam z gotowego API do gry MMO, celem napisania bota (wykorzystującego API).

 

Jednym z głównych obiektów jest oczywiście

class player

, która zawiera w sobie obiekty:

 int x; 
int y;
int z;

 

Chyba wiadomo o co chodzi, położenie gracza w przestrzeni :]

 

W dokumentacji mogę przeczytać, że mogę się do tych obiektów odwoływać intuicyjnie, za pomocą

cout << "Jestes na pozycji " << player.x; // wyświetli 1672 

 

Jednak nie mogę ich zmieniać, to znaczy:

 

player.x = 155; 
cout << "Jestes na pozycji " << player.x; // NADAL wyświetli 1672 - co jest chyba logiczne, gdyż aby znaleźć się w punkcie 155 to jest to trochę zachodu z zapierdalaniem po mapie :P

 

 

Jak osiągnąć taki sam efekt?

Ta sygnatura jest pusta.

Opublikowano

dodać sprawdzanie czy możliwa jest zmiana wartości o X, przez 1 klatkę.. chyba :P

 

btw. jak sobie piszesz .dll to stworzenie obiektu klasy i wprowadzanie w nim zmian nic Ci nie da.

 

Musisz stworzyć wskaźnik na klasę i go dobrze ustawić, żeby pokazywał na obiekt klasy z gry i wtedy robić zmiany.

 

player *pl = (player *)0x00000000;

pl->x = 155;

Opublikowano
dodać sprawdzanie czy możliwa jest zmiana wartości o X, przez 1 klatkę.. chyba

To znaczy...? :) Mógłbyś coś więcej napisać na ten temat, jak takie sprawdzenie "dodać"...?

 

 

@Down:

Nie znam sposobu konkretniejszego wytłumaczenia niż ten dwa posty wyżej :|

Ta sygnatura jest pusta.

Opublikowano

To Ty może daj jakieś konkrety.

liczylem na barce lecz ona niemogla wygrac.

Przez kibicow ktorzy przy rzutach roznych wolnych swiecili w messiego laserami

Opublikowano

no ja bym chyba co klatkę zapisywał wartość jakiejś zmiennej do zmiennej Last, i jeśli w nowej klatce nowa wartość tej zmiennej jest większa np. o 100 to zmieniam jej wartość na Last, bo widzę jakąś próbę oszustwa ;)

  • 2 tygodnie później...
Opublikowano

Załatwię to private'm albo przeładowaniem operatorów.

Jak będę miał to SOLVED, to wkleję tutaj.

 

Tymczasem...

 

5.

Czy jest jakiś sposób na "podejrzenie" funkcji ze standardowej biblioteki?

 

W C++ reference jest oczywiście opis tych funkcji -> opis, co robią, przyjmnowane argumenty i przykłady...

Jednak, gdybym chciał zobaczyć source code danej fucnkji, gdzie powinienem szukać?

Ta sygnatura jest pusta.

Opublikowano

Załatwię to private'm albo przeładowaniem operatorów.

Jak będę miał to SOLVED, to wkleję tutaj.

 

Tymczasem...

 

5.

Czy jest jakiś sposób na "podejrzenie" funkcji ze standardowej biblioteki?

 

W C++ reference jest oczywiście opis tych funkcji -> opis, co robią, przyjmnowane argumenty i przykłady...

Jednak, gdybym chciał zobaczyć source code danej fucnkji, gdzie powinienem szukać?

 

lol omfg po co ci to rotlf

 

@Osama,

 

wg twojego rozumowania to każda aplikacja jest open source

liczylem na barce lecz ona niemogla wygrac.

Przez kibicow ktorzy przy rzutach roznych wolnych swiecili w messiego laserami

Opublikowano

 

@Osama,

 

wg twojego rozumowania to każda aplikacja jest open source

Przecież nic nie piszę o open source.

RAsfepN.png
Opublikowano

Skoro mówisz że po wrzuceniu mamy dostęp do source code czyli mam wolny dostęp do source.

 

Można powiedziec otwarty. Open Source

liczylem na barce lecz ona niemogla wygrac.

Przez kibicow ktorzy przy rzutach roznych wolnych swiecili w messiego laserami

Opublikowano

Disassembler - program tłumaczący kod maszynowy na kod źródłowy w języku asemblera.

 

Z tym open source coś ci się uroiło. Open source jest wtedy kiedy twórca oprogramowania opublikuje kod programu.

RAsfepN.png
  • 3 miesiące temu...
Opublikowano

Okej panoćkowie.

SOLVED!

 

Zacznijmy od mojej bzdury:

2. Oczywiście, że jest. C++ jest bardziej rozbudowany od js...

Ale silniej typizowany - stąd moja obawa, że może czegoś takiego nie być (na pewno nie ma w keywordach).

 

Chodziło o typizowanie dynamiczne:

http://en.wikipedia.org/wiki/Dynamic_typing#Dynamic_typing

 

 

Problem 1:

Chodziło o "read-only C++ class attribute":

 

#include <iostream>
class A {
private: int _x;

public:
	const int &x;
	void setX(int v) { _x = v; }

/// constructor
A() : x(_x)
{
	_x = 0;
}

};
using namespace std;
int main() {

A a;
cout << a.x << endl;
a.setX(15);
cout << a.x << endl;

/// error: assignment of read-only location
/// a.x = 1;

a.setX(25);
cout << a.x << endl;

/// error: assignment of read-only location
/// a.x = 22;

return 0;
}

 

Również można to osiągnąć za pomocą przeciążenia operatora '='. Unikamy wtedy błędu kompilatora:

(kod własny. Wypadałoby jeszcze przeciążyć pozostałe operatory arytmczne)

 

 

class READ_ONLY_INT_ATTR {
private:
	int value;

public:

	/// set function
	void set(int v) { value = v; }

	READ_ONLY_INT_ATTR (int v = 0) {
		value = v;
	}

	READ_ONLY_INT_ATTR operator= (int v) /// nic nie robi
	{
	}

	friend ostream &operator<< (ostream &out, const READ_ONLY_INT_ATTR &c)
	{
			out << c.value;
			return out;
	}

};

class A {
public:
	READ_ONLY_INT_ATTR x;

	void setX(int v) { x.set(v); }

/// constructor
A()
{
	x.set(0);
}

};

using namespace std;
int main() {
A a;
std::cout << a.x << endl;
a.x = 5;
std::cout << a.x << endl;
a.setX(5);
std::cout << a.x << endl;
a.x = 0;
std::cout << a.x << endl;
return 0;
}

 

 

 

- - - - - - -

 

Problem 2:

 

Istnieje możliwość sprawdzenia typu obiektu, poprzed dynamic casting:

http://stackoverflow.com/questions/351845/finding-the-type-of-an-object-in-c

 

Wydaje się to jednak niepotrzebne ( chyba, że w jakiś specjalnych przypadkach ), ze względu na C++'owskie przeciążanie funkcji.

( dlatego też w JavaScripcie ten mechanizm jest tak ważny - nie istnieje tam przeciążenie funkcji - jedna funkcja przyjmuje całkowicie dowolne argumenty, jako obiekt arguments, zachowujący się jak tablica )

 

- - - - - - -

 

Problem 3:

Istnieje rozwiązanie problemu 2.

 

- - - - - - -

 

Problem 4:

Chodziło o konstruktor.

Chodzilo o instrukcję "int array[50]{0};".

 

- - - - - - -

 

Problem 5:

Faktyczny kod źródłowy zależy od implementacji ( nie specyfikacji ) i często pochowany jest w bibliotekach.

Jednak ten projekt sprawuje się do tego celu bardzo dobrze:

http://www.raspberryginger.com/jbailey/minix/html/dir_c5ca42b5e6103be59051410a9fdde24d.html

Ta sygnatura jest pusta.

Opublikowano

Brawo! Typeid przyda się szczególnie do poznawania na jaką klasę aktualnie pokazuje pointer co nie zawsze jest jasne w gąszczu kodu :) Wiedza warta przyswojenia B)

Opublikowano

Problem 2.

Po co to?

Można sprawdzać po wielkości(dosyć problematyczne)...

Wszystko przez to że coś takiego jak typy zmiennych nie istnieją w kodzie maszynowym. A więc jeżeli ktoś ma taki operator to oznacza że kłamie....

Cytat

 

Orientacja seksualna polega na tym, że jeden mężczyzna lubi blondynki, drugi szatynki, że jedna pani woli umięśnionych mężczyzn a inna chudych intelektualistów. Homoseksualizm nie jest orientacją jest chorobą za którą homoseksualiści nie ponoszą odpowiedzialności. Pewna grupa ludzi rodzi się upośledzona fizycznie, na przykład bez ręki ale czy to znaczy, że wszystkim zdrowym powinniśmy też obcinać ręce? Nie, powinniśmy zapewnić im protezy. Obowiązkiem państwa jest zapewnienie homoseksualistom, jak wszystkim upośledzonym fizycznie czy psychicznie profesjonalnej opieki medycznej.

Opublikowano

Czemu niby?

Cytat

 

Orientacja seksualna polega na tym, że jeden mężczyzna lubi blondynki, drugi szatynki, że jedna pani woli umięśnionych mężczyzn a inna chudych intelektualistów. Homoseksualizm nie jest orientacją jest chorobą za którą homoseksualiści nie ponoszą odpowiedzialności. Pewna grupa ludzi rodzi się upośledzona fizycznie, na przykład bez ręki ale czy to znaczy, że wszystkim zdrowym powinniśmy też obcinać ręce? Nie, powinniśmy zapewnić im protezy. Obowiązkiem państwa jest zapewnienie homoseksualistom, jak wszystkim upośledzonym fizycznie czy psychicznie profesjonalnej opieki medycznej.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...