Definire globala a unei variabile de tip definit utilizator

Intrebari despre limbajul C++/CLI (si versiunile mai vechi MC++), applicatii mixed-mode sau probleme specifice .NET legate de C++.
rdenis
Membru
Membru
Posts: 50
Joined: 10 Apr 2010, 20:16
Judet: Iaşi

Definire globala a unei variabile de tip definit utilizator

Post by rdenis » 18 Jun 2010, 15:05

buna tuturor..problema mea este urmatoarea: am scris o clasa (CMyClass) cu anumite functii din care doresc sa derivez un obiect global; si aici ma refer sa fie vizibil intre toate form-urile proiectului (adica sa-l initializez intr-un form, sa am access la anumite functii si variabile in alt form etc.)....
exemplu concret:

Code: Select all

#include "CMyClass.h"

namespace CMyapplication
{
	CMyClass^ myobj;

}
Acest cod este salvat intr-un fisier .h si inclus in fiecare form unde am nevoie de access la acest obiect...insa vs2008 nu este deacord cu mine si imi genereaza urmatoarea eroare:

Code: Select all

error C3145: 'myobj' : global or static variable may not have managed type 'CMyapplication::CMyClass ^'
am incercat chiar sa ii dau FQN si tot primesc aceasta eroare...

aveti idee de ce? sau cum as putea face acest obiect sa fie vizibil in toate form-urile??




rdenis
Membru
Membru
Posts: 50
Joined: 10 Apr 2010, 20:16
Judet: Iaşi

Re: Definire globala a unei variabile de tip definit utiliza

Post by rdenis » 18 Jun 2010, 19:14

mersi zlatomir... asta raspunde doar la prima mea intrebare (cea de ce primesc eroarea) insa trebuie sa fie si un workaround pt ca ar fi absurd sa nu poti defini o variabila la nivel de aplicatie...

User avatar
zlatomir
Membru++
Membru++
Posts: 282
Joined: 04 Jul 2009, 23:59
Location: Arad
Contact:

Re: Definire globala a unei variabile de tip definit utiliza

Post by zlatomir » 18 Jun 2010, 20:04

Din pacate, la cea de-a doua intrebare nu pot raspunde :oops:

Dar ce pot sa iti zic e o recomandare: daca vrei managed (.NET) foloseste/invata c#, daca vrei native foloseste c++, pt ca c++/CLI e un "animal mai aparte", cu unele chestii "ciudate" si nu are aproape nici o legatura cu standard c++ (ma rog si c++/CLI parca e standardizat, dar nu are legatura cu c++98/03/0x)

rdenis
Membru
Membru
Posts: 50
Joined: 10 Apr 2010, 20:16
Judet: Iaşi

Re: Definire globala a unei variabile de tip definit utiliza

Post by rdenis » 18 Jun 2010, 20:21

observ ca devine mai greu de programat in c++/cli decat in vc++ cu mfc sau wtl....insa astea imi sunt cerintele, c++/cli pe .net 2.0.....ceea ce doresc eu sa fac este sa creez un wrapper pt CRUD pe o baza de date care sa fie procesat printr-o singura conexiune la DB si acest obiect sa fie valabil in intreaga aplicatie...

Viorel
Microsoft MVP
Microsoft MVP
Posts: 291
Joined: 13 Jul 2007, 12:26

Re: Definire globala a unei variabile de tip definit utiliza

Post by Viorel » 18 Jun 2010, 21:51

Încearcă asta:

Code: Select all

#include "CMyClass.h"

ref struct CMyapplication abstract
{
    static CMyClass ^ myobj;
};

rdenis
Membru
Membru
Posts: 50
Joined: 10 Apr 2010, 20:16
Judet: Iaşi

Re: Definire globala a unei variabile de tip definit utiliza

Post by rdenis » 19 Jun 2010, 06:20

multumesc viorel....asta e solutia pe care o gandisem/gasisem si eu :biggrin: .... :thumbsup: :thumbsup:

tudor_t
Membru
Membru
Posts: 112
Joined: 26 Aug 2007, 15:11

Re: Definire globala a unei variabile de tip definit utiliza

Post by tudor_t » 19 Jun 2010, 12:00

rdenis wrote: ar fi absurd sa nu poti defini o variabila la nivel de aplicatie...
Chiar daca tehnic se poate, o variabila globala la nivel de aplicatie e mai intotdeuna o idee nerecomandata mai in toate situatiile..
In cazul tau, o singura conexiune globala la nivel de aplicatie, e o idee buna doar din comoditate la scrierea codului - altfel in general se recomanda sa se creeze si sa se deschida o conexiune doar cand e strict necesar si sa fie inchisa/dealocata cand nu mai e necesara..

neagu_laurentiu
Membru++
Membru++
Posts: 919
Joined: 23 Jul 2007, 11:32

Re: Definire globala a unei variabile de tip definit utiliza

Post by neagu_laurentiu » 19 Jun 2010, 14:46

tudor_t wrote:o variabila globala la nivel de aplicatie e mai intotdeuna o idee nerecomandata mai in toate situatiile
Nu am inteles niciodata principiile astea ! Cat timp limbajul suporta ceva, foloseste. Daca nu era util nu era inclus.
Altfel alegi limbaje ce te tin in frau si-ti indica calea spre lumina :)

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Definire globala a unei variabile de tip definit utiliza

Post by Ovidiu Cucu » 19 Jun 2010, 19:36

Ideea cu conexiunea la baza de date deschisa la pornirea aplicatiei si inchisa la terminarea aplicatiei ar fi buna in cazul cand se conecteaza unul sau un numar mic de clienti.
Daca numarul de clienti e mare nu mai e chiar asa de bine.
Oricum, in general, castigul in performanta nu-i cine stie ce.
Ca sa te convingi, poti face niste teste si pun pariu ca o sa observi ca primul connect o sa-ti ia ceva mai mult timp, iar urmatoarele mult mai putin.

neagu_laurentiu
Membru++
Membru++
Posts: 919
Joined: 23 Jul 2007, 11:32

Re: Definire globala a unei variabile de tip definit utiliza

Post by neagu_laurentiu » 19 Jun 2010, 21:22

Ovidiu Cucu wrote:o sa observi ca primul connect o sa-ti ia ceva mai mult timp, iar urmatoarele mult mai putin
fiindca server-ul nu omoara conexiunea, ci se asteapta sa revii (tu sau altul). Adica povestea connection pool.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Definire globala a unei variabile de tip definit utiliza

Post by Ovidiu Cucu » 19 Jun 2010, 22:43

Right. S-ar putea chiar unele servere sa se prinda ca tii conexiunea de pomana si sa te trezesti c-un "Connection to database lost" :).

tudor_t
Membru
Membru
Posts: 112
Joined: 26 Aug 2007, 15:11

Re: Definire globala a unei variabile de tip definit utiliza

Post by tudor_t » 20 Jun 2010, 10:43

neagu_laurentiu wrote:Nu am inteles niciodata principiile astea ! Cat timp limbajul suporta ceva, foloseste. Daca nu era util nu era inclus.
Altfel alegi limbaje ce te tin in frau si-ti indica calea spre lumina :)
Nu prea sunt astfel de limbaje - si in C# sau Java, ca si in C++ e la fel de usor de definit o variabila globala, chiar daca ii spune altfel (static property)...
Pricipiile sunt pentru cine e la inceputuri si trebuie sa aleaga dintre mai multe variante - normal - cel ce stie ce face si la ce sa se astepte, va folosi si variabile globale acolo unde intr-adevar e necesar..
Mai rau e cand cineva foloseste variabile globale din lene de a mai transmite parametrii de la o functie la alta..

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Definire globala a unei variabile de tip definit utiliza

Post by Ovidiu Cucu » 20 Jun 2010, 16:11

Ca tot vorbim de variabile/constante globale sau nu...

De la incepator la expert, pas cu pas - cu exemple de utilizare a mesajelor Windows utilizator
  1. incepator: scriem si noi ce-am vazut prin cartea lui Petzold

    Code: Select all

    #define WM_APP_MESSAGE0 (WM_APP)
    #define WM_APP_MESSAGE1 (WM_APP+1)
    #define WM_APP_MESSAGE2 (WM_APP+2)
    // ... and so on.
  2. incepator-avansat: am citit "Effective C++" si-am aflat ca "macros are evil"

    Code: Select all

    extern const UINT WM_APP_MESSAGE0;
    extern const UINT WM_APP_MESSAGE1;
    extern const UINT WM_APP_MESSAGE2;
    // ... and so on.
  3. mediu: stim ceva termeni OOP si facem primele incercari de incapsulare

    Code: Select all

    class CMessageHelper
    {
    public:
       static const UINT WM_APP_MESSAGE0;
       static const UINT WM_APP_MESSAGE1;
       static const UINT WM_APP_MESSAGE2;
       // ... and so on.
    };
  4. mediu-avansat: incapsularea deja nu mai prezinta taine

    Code: Select all

    class CFoo
    {
    private:
       static const UINT WM_MESSAGE0;
       static const UINT WM_MESSAGE1;
       static const UINT WM_MESSAGE2;
       // ... and so on.
    public:
       UINT GetMessage0() const {return WM_MESSAGE0;}
       UINT GetMessage1() const {return WM_MESSAGE1;}
       UINT GetMessage2() const {return WM_MESSAGE2;}
       // ... and so on.
    };
  5. expert (architect): OOP-ul "clasic" a devenit boring, nu mai impresioneaza managerii, asa ca dam tarcoale la chestii mai avansate

    Code: Select all

    // Imessage.h
    class IMessage
    {
    protected:
       IMessage() {}
       ~IMessage() {}
    public:
       virtual UINT GetMessage() const = 0;
    };

    Code: Select all

    // Message.h
    class CMessage : public IMessage
    {
       UINT m_uMessage;
    public:
       CMessage(UINT uMessage) : m_uMessage(uMessage) {}
       virtual ~CMessage() {}
    public:
       virtual UINT GetMessage() const {return m_uMessage;} 
    };

    Code: Select all

    // ZeroMesage.h
    class CZeroMessage : public CMessage
    {
    public:
       CZeroMessage() : CMessage(WM_APP) {}
       virtual ~CZeroMessage() {}
    };

    Code: Select all

    // OneMessage.h
    class COneMessage : public CMessage
    {
    public:
       COneMessage() : CMessage(WM_APP + 1) {}
       virtual ~COneMessage() {}
    };

    Code: Select all

    // ... and so on.

    Code: Select all

    // MessageFactory.h
    class CMessageFactory
    {
    public:
       enum MessageType {WM_MESSAGE0, WM_MESSAGE1, /* ...and so on. */};
       static IMessage* createMessage(MessageType type);
    };

    Code: Select all

    // MessageFactory.cpp
    IMessage* CMessageFactory::createMessage(MessageType type)
    {
       IMessage* pMessage = NULL;
       switch(type)
       {
       case WM_MESSAGE0:
          pMessage = new CZeroMessage;
          break;
       case WM_MESSAGE1:
          pMessage = new COneMessage;
          break;
       // ... and so on.
       }
       return pMessage;
    }
    Si in sfarsit, pentru "luzerii" de developeri, dam un exemplu de utilizare

    Code: Select all

    ::SendMessage(hWnd, 
                  CMessageFactory::createMessage(CMessageFactory::WM_MESSAGE0)->GetMessage(), 
                  wParam, lParam);
    Note: Rog nu criticati! M-am straduit s-o scurtez ca sa incapa in forum. Recunosc, se putea si mai rau. :)
    .
  6. expert-avansat (super-architect): Nirvanaaaa... Eh, las asta ca tema pentru acasa.
    Note:
    • NU uitati diagramele UML!
    • lecturi ajutatoare: Design Patterns;
    • cuvinte cheie: singleton, factory, command, decorator, interceptor, template, multiple (virtual) inheritance, reinterpret_cast;
    • luati aminte vorba lui Napoleon: "Orice programator poarta in geanta laptop-ului bastonul de Architect". :biggrin: :biggrin:

rdenis
Membru
Membru
Posts: 50
Joined: 10 Apr 2010, 20:16
Judet: Iaşi

Re: Definire globala a unei variabile de tip definit utiliza

Post by rdenis » 20 Jun 2010, 18:53

si sa revin si eu prin thread :biggrin: ....conexiunea mea nu e din lene si nu e ca vreau sa impresionez...am nevoie sa fac cateva operatiuni simple pe un DB MSSQL 200xEE, adica sa listez niste date din care userul sa selecteze ce vrea mai apoi sa stearga si sa trimita comanda la server....asta era prima functie, a doua ar fi sa sterg eu automat niste inregistrari din DB care in urma folosirii unei alte aplicatii ce a generat o eroare si si-a dat duhul au ramas, sa zic, "in aer" iar aplicatia cand va fi repornita fara stergerea acelor date ghiciti ce se va intampla :twisted: :keeporder: .... de aici am si plecat pe ideea crearii unei clase ce va contine cateva functii care vor face, in primul, sa combine cateva comenzi SQL iar apoi sa le trimita catre server dupa care sa inchida conexiunea si atat...practic aplicatia mea e un fel de patch pt echipa de suport din care fac si parte :yes: :thumbsup:

multumesc tuturor pt idei si impresii...recunosc ca sunt incepator si probabil, sigur o sa-mi mai prind urechile asa ca o sa revin cu siguranta pt ajutor...

ps: daca e cineva din iasi as fi incantat sa mai impartasesc niste ideii si chiar o bere :biggrin:

Post Reply