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++ / March 2005

Tip: Looking for answers? Try searching our database.

"syntax error: identifier" instantiating another class within same namespace?

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
Stephen Corey - 10 Mar 2005 18:34 GMT
I've got 2 classes in 2 seperate header files, but within the same
namespace. If I use a line like:

// This code is inside Class2's header file
Class1 *newitem = new Class1(param1, param2);

I get "syntax error: identifier" and "undeclared identifier". Since
they're in the same namespace, and even in the same project, do I need
to do anything special, like put an "#include <theotherfile.h>" in each
header or anything???
Carl Daniel [VC++ MVP] - 10 Mar 2005 19:36 GMT
> I've got 2 classes in 2 seperate header files, but within the same
> namespace. If I use a line like:
[quoted text clipped - 6 lines]
> to do anything special, like put an "#include <theotherfile.h>" in
> each header or anything???

Yes.

The compiler only every looks at one file at a time.  If you're compiling
x.cpp, the compiler sees x.cpp and everything that it includes (directly or
indirectly) in the order that it's included.  Anything that you reference
must have been declared (and possibly defined) before the point of
reference.

Generally speaking, if you have mutually dependent classes, you'll have to
"forward declare" one of the classes.  Any decent C++ book will cover the
necessities.

-cd
Stephen Corey - 10 Mar 2005 19:47 GMT
>>I've got 2 classes in 2 seperate header files, but within the same
>>namespace. If I use a line like:
[quoted text clipped - 20 lines]
>
> -cd

Thanks for the response!

What if each class references the other one (circular references). How
would you handle that?
Carl Daniel [VC++ MVP] - 10 Mar 2005 22:47 GMT
>>> I've got 2 classes in 2 seperate header files, but within the same
>>> namespace. If I use a line like:
[quoted text clipped - 25 lines]
> What if each class references the other one (circular references). How
> would you handle that?

class X;

class Y
{
  X* m_X;
};

class X
{
 Y* m_y;
};

If you need member functions of the classes to access members of the "other
type", you'll need to define your class implementation outside the class
definition:

struct X
{
  int m_i;
  void useY();
};

struct Y
{
 int m_j;
 void useX();
};

void X::useY()
{
  Y y;
  y.m_j;
}

void Y::useX()
{
  X x;
  x.m_i;
}

A "forward declaration" (or "incomplete class declaration" in standardese)
allows you to refer to a class in contexts that don't require knowing the
size or interface of a class (such as declaring a pointer or reference
variable or parameter).  In order to declare a variable of the class type,
or access any members of the class, a complete class is required.

Between forward declarations and out of line member definitions, you should
be able to handle any sensible mutual dependency.

-cd
Bob Milton - 10 Mar 2005 22:49 GMT
Stephen,
   Say you have classes X and Y that reference each other. The two headers
would look something like:

X.H:
   class Y ;

   class X
   {
   .
   .
   .
   Y *myYRef ;
   .
   .
   } ;

and Y.H would look something like:

   class X ;

   class Y
   {
   .
   .
   .
   X *myXRef ;
   .
   } ;

Then the implementations of X and Y need to include both header files. (And
users of either may also need both headers).
   Bob Milton

>>>I've got 2 classes in 2 seperate header files, but within the same
>>>namespace. If I use a line like:
[quoted text clipped - 25 lines]
> What if each class references the other one (circular references). How
> would you handle that?

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.