Jump to content
Che

Cum as putea face asta in C++ ?

Recommended Posts

As vrea sa stiu daca se poate face urmatoatea chestie in C++:

1) In functie de anumite analize pe care le face programul asupra unui input dat, sa creeze o noua clasa sa zicem B pentru acel input care sa fie de novo sau sa mosteneasca o alta clasa deja existenta, numita A. Practic clasa A exista deja iar clasa B o va crea programul insusi DACA are nevoie sau nu si daca are nevoie, clasa B o va mosteni pe A, sau nu.

2) Tot in functie de anumite analize pe care le face programul asupra unui input dat, sa poata crea o noua functie in clasa deja existenta A sau in cea nou creata B, sau sa-i adauge un nou atribut.

Imi poate da cineva niste exemple despre cum s-ar putea face asta in C++ ?

Presupunand ca nu se poate face asa ceva in C++, in ce alt(e) limbaj(e) ar fi posibil acest lucru ?

Multumesc mult de tot !

Link to comment
Share on other sites

Din cate am inteles eu tu vrei sa declari o clasa (adica un nou tip) la run-time in functie de ce date primesti. Daca am inteles bine atunci pot spune ca nu este posibil. Deci sa fie clar. Nu poti declara o clasa, functie sau ce vrei tu, dupa ce programul a fost asamblat. Poti sa creezi instante din clase/tipuri deja declarate. Daca am inteles gresit atunci imi cer scuze.

Poate daca incorporezi o limba dinamica precum Lua, Squirrel etc. in programul tau principal. Te poti folosii de dinamismul acelor limbi de programare pentru a obtine cea ce vrei tu. (am destula exprienta cu Squirrel si pot spune ca este foarte usor de folosit si suporta OOP)

Edited by S.L.C
Link to comment
Share on other sites

Uitandu-ma prin unele limbaje de programare, cred ca ceea ce vrei tu, s-ar putea face in python, relativ simplu. In c++ este imposibil, dupa cum a spus si S.L.C. deoarece clasele au insemnatate doar in codul c++, nu si in aplicatia in sine.

aici ai un exemplu despre cum se poate genera o clasa, mostenind din alta clasa, si la care sa ii adaugi proprietati noi, totul intr-o singura functie.

Iar pentru a cauta in membri, si pentru a ii enumera poti folosi modulul inspect

Link to comment
Share on other sites

Uitandu-ma prin unele limbaje de programare, cred ca ceea ce vrei tu, s-ar putea face in python, relativ simplu. In c++ este imposibil, dupa cum a spus si S.L.C. deoarece clasele au insemnatate doar in codul c++, nu si in aplicatia in sine.

aici ai un exemplu despre cum se poate genera o clasa, mostenind din alta clasa, si la care sa ii adaugi proprietati noi, totul intr-o singura functie.

Iar pentru a cauta in membri, si pentru a ii enumera poti folosi modulul inspect

Ca sa intelegeti mai bine ce vreau sa zic, am gasit si urmatorul exemplu:

c++ - How to create class objects dynamically? - Stack Overflow

Vezi primul raspuns, cel notat cu 7 puncte.

Zice asa:

class Animal {...};

class Dog : public Animal {...}

class Cat : public Animal {...}

Problema e ca nu vreau asa, la mine clasa Animal poate sa nu existe si doar daca programul considera ca e nevoie de o clasa Animal, atunci creaza clasa Animal, de la zero, fara sa mosteneasca vreo alta clasa sau sa se foloseasca de vreo clasa template.

Si abia apoi programul va scrie codul de mai sus.

!!! =>Pe urma, la un moment dat, daca programul ajunge la concluzia ca trebuie sa distruga, sa stearga definitiv din codul sau clasa Animal, atunci o va sterge si Clasele Dog si Cat de mai sus vor fi clase noi, de sine statatoare, fara sa mosteneasca vreo clasa Animal sau altceva.

Se poate face asta in Python ? Dar folosind doar retele neuronale nu se poate face asta, ca sa nu ma mai complic sa invat Python ? Dar folosing doar Erlang, Haskell, Lisp sau Prolog ?

Link to comment
Share on other sites

De ce te complici atât când lucrurile pot fi simple?

Tu practic ai nevoie de „variabile dinamice” pe care s? le po?i copia într-o nou? „categorie” atunci când ai nevoie de ele.

Lucrurile astea pot fi rezolvate foarte simplu cu ajutorul map-urilor, unde ai key/value, key-ul reprezentând noua „variabil?” (pe care o po?i denumi dup? bunul plac), iar value, valoarea efectiv? a respectivei „variabile”.

Mo?tenirea poate fi „simulat?” prin copierea acelor key care te intereseaz?.

Î?i scriu un exemplu de clas? care poate fi folosit? pentru toate „categoriile”:

#include <iostream>

#include <string>

#include <map>

#include <vector>

using namespace std;

class Categorie

{

public:

Categorie(string tip)

{

this->tip = tip;

}

Categorie(string tip, Categorie parinte, vector<string> proprietati)

{

this->tip = tip;

vector<string> proprietati_parinte = parinte.ProprietatileMele();

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

this->AdaugaProprietate(proprietati_parinte, "");

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

this->AdaugaProprietate(proprietati, parinte.CitesteProprietate(proprietati));

}

void AdaugaProprietate(string nume, string valoare)

{

this->proprietati[nume] = valoare;

}

string CitesteProprietate(string nume)

{

return this->proprietati[nume];

}

vector<string> ProprietatileMele()

{

vector<string> proprietati;

for (map<string, string>::iterator i = this->proprietati.begin(); i != this->proprietati.end(); i++)

proprietati.push_back(i->first);

return proprietati;

}

private:

string tip;

map<string, string> proprietati;

};

Iar folosirea ar putea fi cam a?a:

int main()

{

Categorie *iepure = new Categorie("iepure");

iepure->AdaugaProprietate("culoare", "alb");

iepure->AdaugaProprietate("mers", "topait");

iepure->AdaugaProprietate("dinti", "alungiti");

Categorie *caine = new Categorie("caine", *iepure, { "culoare" });

caine->AdaugaProprietate("mers", "normal");

cout << iepure->CitesteProprietate("culoare") << endl;

cout << iepure->CitesteProprietate("mers") << endl;

cout << iepure->CitesteProprietate("dinti") << endl;

cout << caine->CitesteProprietate("culoare") << endl;

cout << caine->CitesteProprietate("mers") << endl;

cout << caine->CitesteProprietate("dinti") << endl;

system("PAUSE");

return 0;

}

Toate cele bune.

  • Upvote 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...