Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsFree MagazinesWhite PapersSubmit Content
Discussion GroupsASP.NETWindows FormsLanguages.NET FrameworkVisual Studio.NET
Articles.NET FrameworkASP.NETToolsWindows Forms
.NET DirectoryOpen Source ProjectsUser GroupsWeb Resources
Related Topics
Visual Basic 6SQL ServerMS AccessOther DB ProductsMS Server ProductsMore Topics ...

.NET Forum / Languages / Managed C++ / January 2007

Tip: Looking for answers? Try searching our database.

gcnew does not generate an object instance?

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
pkolinko@hotmail.com - 07 Jan 2007 00:47 GMT
Hi everyone,

I am writing a small low level embedded USB application using C++/CLI
windows Forms.
I am sort of new to the C++/CLI and having trouble understanding what
happens in this very simple line of code:

I have a reference class pic_usbapi, declared in "pic_usbapi.h".
I want to create an object of the class and have a tracking handle for
it.
It should be simple to do, see CODE#1 and CODE #2

Basically, the problem is this:
--------------------------------------------
A) If I declare p_usbapi as an object without the hat, see CODE#1,
then no problem, but then p_usbapi does not seem to behave like a
tracking handle.
In particular, I can't access member functions using -> such as
p_usbapi->led1();
I thought addressing reference classes was always done through a
handle?

B) Okay, so what if I declare p_usbapi to be a handle, with the hat,
CODE#2
Then the code compiles, but i get an exception when trying to address/
assign anything that has to do with p_usbapi. The reason is that an
object apparently was not created and handle is still null. I thought
that "gcnew pic_usbapi" was supposed to create the object no matter
what.

What I really would like to understand is why in CODE#2, an object of
the type pic_usbapi is not created and the p_usbapi handle is NULL.

Thanks!

// ********************** CODE # 1 *********************************
// This code works:
//
---------------------------------------------------------------------------------
#include "pic_usbapic.h"
public:
    Form1(void)    //constructor for Form1;
    {
        InitializeComponent();
        pic_usbapi^  p_usbapi = gcnew pic_usbapi;  // Statement #1
    }
//some code here
private:
    pic_usbapi p_usbapi; //Declaration of an object, no hat.

// some time later a member function is called:
       p_usbapi.led1();          // I don't want to do this, but it
works.
       // p_usbapi -> led1();  // does not work here, because p_usbapi
is not a handle.
                                        // weird, how can it not be a
handle, its a reference class!

//*********************************** CODE #2
**********************************************
//This code throws an exception during runtime, because p_usbapi object
does not exist:
//---------------------------------------------------------------------------------

#include "pic_usbapic.h"
public:
    Form1(void)    //constructor for Form1;
    {
        InitializeComponent();
        pic_usbapi^  p_usbapi = gcnew pic_usbapi;  // Statement #1
    }
//some code here
private:
    pic_usbapi^  p_usbapi; //Declaration of a tracking handle

// some time later a member function is called:
  p_usbapi->led1();  //  PROBLEM: Exception is thrown, as p_usbapi
object does not exist.
                             //  I verified that p_usbapi does not
exist using the debugger.
                             //  And, of course, also after compiling
the program

//
---------------------------------------------------------------------------------
Marcus Heege - 07 Jan 2007 01:02 GMT
Hi

Re CODE #1: If you define a reference type variable without a hat, an object
will be created implicitly and the instance will be implicitly disposed when
the variable leaves scope. Like in C++ you have to use the dot (.) instead
of the -> for these kinds of variables.

Re CODE #2: You define two variables, a member variable in a reference class
and a local variable in the Form's constructor. Since the member variable is
never initialized, trying to invoke members on it will cause an exception.

Marcus

> Hi everyone,
>
[quoted text clipped - 81 lines]
> //
> ---------------------------------------------------------------------------------
pkolinko@hotmail.com - 07 Jan 2007 01:30 GMT
Thanks!

I understand #1 now.

Regarding #2, I was wondering if you could explain it a bit more:
The member variable p_usbapi is a private member of Form1,
and is initialized in the constructor.

I don't quite understand how a local variable is created.
I thought I was initializing the Form1 member variable p_usbapi in the
constructor.

> Hi
>
[quoted text clipped - 8 lines]
>
> Marcus
pkolinko@hotmail.com - 07 Jan 2007 02:12 GMT
Ok, I got it.
If the syntax is wrong, I actually get two different variables,
one local and the other member of class.

Thank you so much!

> Hi
>
[quoted text clipped - 94 lines]
> > //
> > ---------------------------------------------------------------------------------

Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.