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

Tablica obiektów


Rekomendowane odpowiedzi

Opublikowano

Czy mógłby mi ktoś stworzyć przykładowy program który ma jakąś klasę, tworzy tablicę obiektów, następnie przenosi ją jako argument do funkcji bądź do metody? Jest mi to potrzebne w programie, ale jakoś nie mogę tego wykonać :> i chciałbym zobaczyć przykładowy taki program.

pl ;)

Opublikowano
#include <iostream> 
using namespace std; 
  
class MyClass { 
  int x; 
public: 
  void setX(int i) { x = i; } 
  int getX() { return x; } 
}; 
 
int main() 
{ 
  MyClass obs[4]; 
  int i; 
 
  for(i=0; i < 4; i++) 
    obs[i].setX(i); 
 
  for(i=0; i < 4; i++) 
    cout << "obs[" << i << "].getX(): " << obs[i].getX() << "\n"; 
 
  return 0; 
}

Co do przenoszenia jej jako argument to poczytaj o metodach z parametrami i sie dowiesz wszystkiego

Osobiście pomagam tylko na PW lub e-mail


-----------------------------------------------------------------


https://github.com/smietanka

Opublikowano

Możesz również używać dynamicznego arraya, powiedzmy std::vector<> (#include <vector>).

#include <iostream> 
#include <vector>

class MyClass
{ 
public: 
	void setX(int i) { x = i; } 
	int getX() { return x; } 
	
private:
	int x;
}; 

void printAll(std::vector<MyClass> objectsToPrint)
{
	for(int i = 0; i < objectsToPrint.size(); i++) 
	{
	    std::cout << objectsToPrint.at(i).getX() << std::endl; 
	}
}

int main() 
{ 
	std::vector<MyClass> objects;
 
	for(int i = 0; i < 4; i++) 
	{
	    objects.push_back(i);
	}
 
	printAll(objects);
 
	return 0; 
}

Edit:

 

Dzięki temu możesz dowolnie rozszerzać arraya o nowe objekty.

 

Edit 2:

 

Lub usuwać wybrane objekty. ;)

 

Edit 3:

 

 

#include <iostream>
using namespace std;

class MyClass {
int x;
public:
void setX(int i) { x = i; }
int getX() { return x; }
};

int main()
{
MyClass obs[4];
int i;

for(i=0; i < 4; i++)
obs.setX(i);

for(i=0; i < 4; i++)
cout << "obs[" << i << "].getX(): " << obs.getX() << "\n";

return 0;
}

Co do przenoszenia jej jako argument to poczytaj o metodach z parametrami i sie dowiesz wszystkiego

 

 

Taka mała dygresja, nie polecam praktykować używania:

using namespace std;

Zalecam używać std::.

 

Powód?

 

Może zdarzyć się, że ktoś stworzy funkcję/metody o takiej samej nazwie jak w std i wtedy może pojawić się problem.

Nawet nie świadomie może istnieć gdzieś funkcja/metoda z taką samą nazwą (Powiedzmy, że ktoś stworzył ulepszoną wersję funkcji z std).

 

Przepraszam, za obszerne tłumaczenie, być może trochę nie zrozumiałe, dlatego tutaj daję link gdzie jest to lepiej wytłumaczone: http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice

 

I nie tyczy się to tylko std, ale też innych namespace.

Opublikowano

Okej, dobra :D widzę, że temat dość wyczerpująco opisany. To z vector to wiedziałem jak zrobić, aczkolwiek chciałem się dowiedzieć z czystej ciekawości jak zrobić to bez niego ;)

 

W takiej sytuacji myślę, że lepiej chyba tego vectora używać, ale wiedzy nigdy za mało.

pl ;)

Opublikowano

Okej, dobra :D widzę, że temat dość wyczerpująco opisany. To z vector to wiedziałem jak zrobić, aczkolwiek chciałem się dowiedzieć z czystej ciekawości jak zrobić to bez niego ;)

 

W takiej sytuacji myślę, że lepiej chyba tego vectora używać, ale wiedzy nigdy za mało.

 

To zależy oczywiście jaki chcesz osiągnąć efekt, czy chcesz dowolnie podczas działania aplikacji rozszerzać tego arraya, czy wystarczy Ci statyczny array o jednorazowo określonej wielkości, zależy co chcesz robić. :)

 

Decyzja należy do Ciebie.

 

Dokładnie, wiedza najważniejsza. :)

Opublikowano
objectsToPrint.at(i).getX()  

 jeśli chodzi o to... bo coś nie mogę się domyśleć o co chodzi. Co to jest te .at() ? To jest jakaś funkcja vectora która coś robi ?

pl ;)

Opublikowano
objectsToPrint.at(i).getX()  

 jeśli chodzi o to... bo coś nie mogę się domyśleć o co chodzi. Co to jest te .at() ? To jest jakaś funkcja vectora która coś robi ?

 

 

Wskazuję na podany index vectora.

 

Tak jak masz powiedzmy:

jakisStatycznyArray[i]

to jak masz:

jakisVector.at(i)

to te at mówi do którego indexa chcesz zajrzeć.

 

Edit:

 

.push_back() wrzuca coś do vectora (Coś o określonym wcześniej typie) na sam wierzch.

 

.size() zwraca Ci wielkość/ilość elementów znajdujących się w środku.

 

Czyli powiedzmy:

std::vector<int> inty;

inty.push_back(123);
inty.push_back(123456);
inty.push_back(91);

to inty.size() zwróci wartość 3, ponieważ wrzuciliśmy tam 3 elementy.

 

Pamiętaj, że jeżeli wskazujesz .at() to zaczynasz liczenie od zera.

Czyli jak chcesz wskazać na pierwszy element używasz .at(0).

 

W przypadku inty gdy uzyjesz:

int liczbaZVectora = inty.at(0);

to liczbaZVectora będzie równe 123, ponieważ taką wartośc ma 1 element.

Opublikowano

Możesz również używać dynamicznego arraya, powiedzmy std::vector<> (#include <vector>).

#include <iostream> 
#include <vector>

class MyClass
{ 
public: 
	void setX(int i) { x = i; } 
	int getX() { return x; } 
	
private:
	int x;
}; 

void printAll(std::vector<MyClass> objectsToPrint)
{
	for(int i = 0; i < objectsToPrint.size(); i++) 
	{
	    std::cout << objectsToPrint.at(i).getX() << std::endl; 
	}
}

int main() 
{ 
	std::vector<MyClass> objects;
 
	for(int i = 0; i < 4; i++) 
	{
	    objects.push_back(i);
	}
 
	printAll(objects);
 
	return 0; 
}

Nie korzystaj z postinkrementacji, lecz z preinkrementacji.

 

 

 

Klamry w pętlach mi się nie podobają, Przy jednej linijce instrukcji zrezygnowałbym z nich.

Zamiast

for(int i = 0; i < objectsToPrint.size(); i++)

skorzystał bym z pętli range-for, ze standardu C++11.

 

 

 

@down

Jak to sensu nie widzisz, a już to, że użył using namespace std:: już było mega złe, bo to zły nawyk.

TuByłaSygnatura.png

Opublikowano

 

Możesz również używać dynamicznego arraya, powiedzmy std::vector<> (#include <vector>).

#include <iostream> 
#include <vector>

class MyClass
{ 
public: 
	void setX(int i) { x = i; } 
	int getX() { return x; } 
	
private:
	int x;
}; 

void printAll(std::vector<MyClass> objectsToPrint)
{
	for(int i = 0; i < objectsToPrint.size(); i++) 
	{
	    std::cout << objectsToPrint.at(i).getX() << std::endl; 
	}
}

int main() 
{ 
	std::vector<MyClass> objects;
 
	for(int i = 0; i < 4; i++) 
	{
	    objects.push_back(i);
	}
 
	printAll(objects);
 
	return 0; 
}

Nie korzystaj z postinkrementacji, lecz z preinkrementacji.

 

 

 

Klamry w pętlach mi się nie podobają, Przy jednej linijce instrukcji zrezygnowałbym z nich.

Zamiast

for(int i = 0; i < objectsToPrint.size(); i++)
skorzystał bym z pętli range-for, ze standardu C++11.

 

 

 

 

@1373230489-U611928.pngVereX. Nie widzę sensu preinkrementacji w for w tym przypadku.

 

Jeżeli chodzi o klamry to.. Przy for i innych pętlach mam taki mam zwyczaj, przy if na przykład nie. Jak kto woli. ;)

 

Zakładałem, że autor tematu nie korzysta ze standardu C++11.

Opublikowano

Ok, Dzięki wielkie :D no to teraz gdy się dowiedziałem o co chodzi z tym .at() to porgram ułożył mi się w logiczną całość, a teraz rozpoczynam walkę z moim programem :D

pl ;)

Opublikowano

 

 

Możesz również używać dynamicznego arraya, powiedzmy std::vector<> (#include <vector>).

#include <iostream> 
#include <vector>

class MyClass
{ 
public: 
	void setX(int i) { x = i; } 
	int getX() { return x; } 
	
private:
	int x;
}; 

void printAll(std::vector<MyClass> objectsToPrint)
{
	for(int i = 0; i < objectsToPrint.size(); i++) 
	{
	    std::cout << objectsToPrint.at(i).getX() << std::endl; 
	}
}

int main() 
{ 
	std::vector<MyClass> objects;
 
	for(int i = 0; i < 4; i++) 
	{
	    objects.push_back(i);
	}
 
	printAll(objects);
 
	return 0; 
}

Nie korzystaj z postinkrementacji, lecz z preinkrementacji.

 

 

 

Klamry w pętlach mi się nie podobają, Przy jednej linijce instrukcji zrezygnowałbym z nich.

Zamiast

for(int i = 0; i < objectsToPrint.size(); i++)
skorzystał bym z pętli range-for, ze standardu C++11.

 

 

 

 

@1373230489-U611928.pngVereX. Nie widzę sensu preinkrementacji w for w tym przypadku.

 

Jeżeli chodzi o klamry to.. Przy for i innych pętlach mam taki mam zwyczaj, przy if na przykład nie. Jak kto woli. ;)

 

Zakładałem, że autor tematu nie korzysta ze standardu C++11.

 

http://forum.4programmers.net/Newbie/245149-wyszukiwanie_i_zliczanie_par_takich_samych_liczb_z_tablicy?p=1101404#id1101404

Opublikowano

 

 

 

Możesz również używać dynamicznego arraya, powiedzmy std::vector<> (#include <vector>).

#include <iostream> 
#include <vector>

class MyClass
{ 
public: 
	void setX(int i) { x = i; } 
	int getX() { return x; } 
	
private:
	int x;
}; 

void printAll(std::vector<MyClass> objectsToPrint)
{
	for(int i = 0; i < objectsToPrint.size(); i++) 
	{
	    std::cout << objectsToPrint.at(i).getX() << std::endl; 
	}
}

int main() 
{ 
	std::vector<MyClass> objects;
 
	for(int i = 0; i < 4; i++) 
	{
	    objects.push_back(i);
	}
 
	printAll(objects);
 
	return 0; 
}

Nie korzystaj z postinkrementacji, lecz z preinkrementacji.

 

 

 

Klamry w pętlach mi się nie podobają, Przy jednej linijce instrukcji zrezygnowałbym z nich.

Zamiast

for(int i = 0; i < objectsToPrint.size(); i++)
skorzystał bym z pętli range-for, ze standardu C++11.

 

 

 

 

@1373230489-U611928.pngVereX. Nie widzę sensu preinkrementacji w for w tym przypadku.

 

Jeżeli chodzi o klamry to.. Przy for i innych pętlach mam taki mam zwyczaj, przy if na przykład nie. Jak kto woli. ;)

 

Zakładałem, że autor tematu nie korzysta ze standardu C++11.

 

http://forum.4programmers.net/Newbie/245149-wyszukiwanie_i_zliczanie_par_takich_samych_liczb_z_tablicy?p=1101404#id1101404

 

 

@NopeDotAvi2 Poniekąd może i masz rację, ale musisz wiedzieć, że w dzisiejszych czasach kompilator i tak jak wykryje, to postinkrementacje zamieni na preinkrementacje...

Opublikowano

Polecam przeczytać punkt 1 i punkt 3 jeszcze raz.

 

I tak dla czytelności nie musisz mnie cytować jeżeli piszesz bezpośrednio pod moim postem.

Opublikowano

A ja polecam mieć swoje zdanie na ten temat. :)

 

Edit:

 

Nie mówie o żadnej optymalizacji tylko o tym, że kompilator zamieni automatycznie jeżeli tylko wykryje.

Zarchiwizowany

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

×
×
  • Dodaj nową pozycję...