Jump to content

  • Log In with Google      Sign In   
  • Create Account


Pointer to class type?


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
18 replies to this topic

#1 fotogames   Members   -  Reputation: 102

Like
0Likes
Like

Posted 06 July 2012 - 01:25 AM

Hello everyone!

I was wondering if anyone knows if it is possible in C++ to make a pointer to a class type, or something in that direction... I don't think it is, but maybe I'll get lucky :) I know I can make a pointer to a class this way:

myClass* classPointer;

But that's not what I'm looking for. I'm looking for a feature where you can make a variable contain a class type. I mean something like this:

class myClass1{};
class myClass2{};

sometype classContainer = &myClass1;

classContainer = &myClass2;

pointerToClass classPointer = new classContainer;

Kinda like this... I guess the two classes (myClass1 & myClass2) need to inherit the same class or something like that. Is this possible? Is it very complicated? If it is just say so :P I guess this is a really weird way of accomplishing what I want and I don't really need this so if it isn't possible or very hard it doesn't matter, I guess i'm still a beginner ^^.

Thanks in advance!

Sponsor:

#2 larspensjo   Members   -  Reputation: 1526

Like
0Likes
Like

Posted 06 July 2012 - 02:11 AM

I think you are trying to get a result in the wrong way. If you explain what you really want to do, then it is easier to find a design that gives you what you need.

It is possible, and also quite common, to have classes inherit from a common base class. When you do that, you can have a pointer to the base class type, and initialize it with one of the derived classes. However, if you have functionality outside of the class that asks the class what type it is and then have conditional functionality from this, then you have missed the idea with OO.

The common pattern is to have a pointer to the base class, and a common method that is then overrided by each sub class. That method will then implement the different behavior. This design pattern allows for more flexibility.
Current project: Ephenation.
Sharing OpenGL experiences: http://ephenationopengl.blogspot.com/

#3 brx   Members   -  Reputation: 689

Like
0Likes
Like

Posted 06 July 2012 - 02:15 AM

This is not possible in C++. Classes in C++ are no objects and therefore it is not possible to store them in a variable. It is possible in different languages (e.g. Java, Smalltalk...).

What problem are you trying to solve with this? Looks to me like you want to implement some kind of factory pattern with this?!

#4 fotogames   Members   -  Reputation: 102

Like
0Likes
Like

Posted 06 July 2012 - 02:30 AM

Thanks for the responses! I'm trying to make some kind of state machine, and I wanted to be able to tell the machine which class the state machine had to make (sounds weird but my english vocab is not broad enough to explain it clearer than this :P) However I've been thinking and I don't think I need an infinite state machine, so I'm going to go with a finite state machine. Thanks for the help guys :)

#5 rip-off   Moderators   -  Reputation: 7964

Like
2Likes
Like

Posted 06 July 2012 - 02:30 AM

What is your high level goal here?

You cannot have a pointer to a class. If the classes are related, you can use a pointer-to-base class with a factory to build a derived class at runtime.

If the classes are not related, a template may suit.

#6 Fredericvo   Members   -  Reputation: 269

Like
0Likes
Like

Posted 06 July 2012 - 07:30 AM

Of course it's possible. How else would you allocate a class on the heap? When you "new" you get a pointer to your class. If it's a pointer to a base class then like another poster said the actual class would implement the different behaviour. It's how I implement gamestates but I digress.

#7 BeerNutts   Crossbones+   -  Reputation: 2716

Like
0Likes
Like

Posted 06 July 2012 - 08:14 AM

This is not possible in C++. Classes in C++ are no objects and therefore it is not possible to store them in a variable. It is possible in different languages (e.g. Java, Smalltalk...).

What problem are you trying to solve with this? Looks to me like you want to implement some kind of factory pattern with this?!


This isn't really correct. Using pointers you can do many flexible things, including storing different class types in a single pointer variable, but you should truly understand what you are doing. If inheriting from a base class won't work, then I'd be very careful going about this solution.
My Gamedev Journal: 2D Game Making, the Easy Way

---(Old Blog, still has good info): 2dGameMaking
-----
"No one ever posts on that message board; it's too crowded." - Yoga Berra (sorta)

#8 brx   Members   -  Reputation: 689

Like
0Likes
Like

Posted 06 July 2012 - 08:40 AM

Of course it's possible. How else would you allocate a class on the heap? When you "new" you get a pointer to your class. If it's a pointer to a base class then like another poster said the actual class would implement the different behaviour. It's how I implement gamestates but I digress.

Ehm... you do not allocate CLASSES on the heap but OBJECTS (i.e. instances of a class). If I understand the initial post correctly, he wants to store a pointer to the CLASS and then later use that pointer to create an instance of the class. In Java, for example you can actually have a variable of the type "Class" and call the method "newInstance" on it which will create an object. This is not possible in C++.

This isn't really correct. Using pointers you can do many flexible things, including storing different class types in a single pointer variable, but you should truly understand what you are doing. If inheriting from a base class won't work, then I'd be very careful going about this solution.

Again, you store a pointer to an instance of a class not to the class itself. This would only be possible if classes were actual objects which they are not in C++.

Edited by brx, 06 July 2012 - 08:41 AM.


#9 Cornstalks   Crossbones+   -  Reputation: 6974

Like
2Likes
Like

Posted 06 July 2012 - 08:40 AM


This is not possible in C++. Classes in C++ are no objects and therefore it is not possible to store them in a variable. It is possible in different languages (e.g. Java, Smalltalk...).

What problem are you trying to solve with this? Looks to me like you want to implement some kind of factory pattern with this?!


This isn't really correct. Using pointers you can do many flexible things, including storing different class types in a single pointer variable, but you should truly understand what you are doing. If inheriting from a base class won't work, then I'd be very careful going about this solution.

I think you misunderstood... the OP wasn't talking about storing an object in a pointer (which you can do, and the object can be of various types), but instead storing a class type in a pointer (which you cannot do). brx is correct.
[ I was ninja'd 71 times before I stopped counting a long time ago ] [ f.k.a. MikeTacular ] [ My Blog ] [ SWFer: Gaplessly looped MP3s in your Flash games ]

#10 Bill Door   Members   -  Reputation: 242

Like
2Likes
Like

Posted 06 July 2012 - 09:45 AM

Thanks for the responses! I'm trying to make some kind of state machine, and I wanted to be able to tell the machine which class the state machine had to make (sounds weird but my english vocab is not broad enough to explain it clearer than this Posted Image) However I've been thinking and I don't think I need an infinite state machine, so I'm going to go with a finite state machine. Thanks for the help guys Posted Image


Take a look at Design Patterns. In particular the State and Strategy pattern. This might help you to work out a solution. I often find the flyweight pattern useful for state machines.

#11 Servant of the Lord   Crossbones+   -  Reputation: 17972

Like
1Likes
Like

Posted 06 July 2012 - 11:40 AM

Kinda like this... I guess the two classes (myClass1 & myClass2) need to inherit the same class or something like that. Is this possible? Is it very complicated? If it is just say so Posted Image I guess this is a really weird way of accomplishing what I want and I don't really need this so if it isn't possible or very hard it doesn't matter, I guess i'm still a beginner

Yes it's possible, yes they need to inherit the same base class. No, it's not very complicated, but yes it may be somewhat more advanced than your current level. Note that that doesn't mean to shirk back, but rather that you should stick your head down and plow stubbornly forward when you encounter problems, by keep asking questions until you understand it. ("Above your level" means, "Get out your climbing gear", not "Go do something else"). (If it's too confusing, that may just be because you haven't yet learned some other concepts that this is built upon, and that you should learn those first, but to mark this concept as one to look forward to learning later)

If you have a base class, MyBase, and two classes that inherit it, DerivedA and DerivedB, a MyBase pointer or reference can actually point to a DerivedA and DerivedB - Or actually, they can only point to the MyBase inherited part of DerivedA and DerivedB (Since DerivedA and DerivedB contain MyBase in it, since they inherited it), but not point at DerivedA and DerivedB themselves.

What good is that, then? Well, if MyBase has a virtual function, let's call it MyVirtualFunc(), and DerivedA and DerivedB overload that virtual function with their own MyVirtualFunc() (taking the exact same parameters and etc...), when you call the "MyBase pointer to DerivedA" MyVirtualFunc() function, it'll actually call DerivedA's overload of it. This is because the function is virtual, and won't behave the same way if it's non-virtual. This only works because DerivedA and DerivedB both inherit MyBase.

Here's an example of that:
class MyBase
{
	 public:
	 virtual void MyVirtualFunc() { std::cout << "MyBase::MyVirtualFunc() was called." << std::endl;}
};


class DerivedA : public MyBase
{
	 public:
	 void MyVirtualFunc() { std::cout << "DerivedA::MyVirtualFunc() was called." << std::endl;}
};


class DerivedB : public MyBase
{
	 public:
	 void MyVirtualFunc() { std::cout << "DerivedB::MyVirtualFunc() was called." << std::endl;}
};

int main()
{
	 MyBase myBase;
	 DerivedA derivedA;
	 DerivedB derivedB;

	 MyBase *myBasePtr = &myBase; //Use a MyBase pointer to point to a MyBase.
	 myBasePtr->MyVirtualFunc(); //Uses MyBase's version.

	 myBasePtr = &derivedA; //Use a MyBase pointer to point to the 'MyBase' inherited part of the DerivedA.
	 myBasePtr->MyVirtualFunc(); //Uses DerivedA's version.


	 myBasePtr = &derivedB; //Use a MyBase pointer to point to the 'MyBase' inherited part of the DerivedB.
	 myBasePtr->MyVirtualFunc(); //Uses DerivedB's version.

	 std::vector<MyBase*> myArray; //Array of multiple different class types of the same base class.
	 myArray.push_back(&myBase);
	 myArray.push_back(&derivedA);
	 myArray.push_back(&derivedB);

	 for(int i = 0; i < myArray.size(); i++)
	 {
		  myArray[i]->MyVirtualFunc();
	 }

	 return 0;
}

Don't abuse it, but learn it, and when it seems to be the best solution for that particular case, use it. It's just another tool in your toolbox, but don't use it for every situation you encounter.
For general guidelines: [Single Responsibillity Principle] [Is-a vs Has-a]
Also: [Inheritance - Basics] and [Inheritance - Virtual functions], and all the rest of that site.

Edited by Servant of the Lord, 06 July 2012 - 11:54 AM.

It's perfectly fine to abbreviate my username to 'Servant' rather than copy+pasting it all the time.

[Fly with me on Twitter] [Google+] [My broken website]

All glory be to the Man at the right hand... On David's throne the King will reign, and the Government will rest upon His shoulders. All the earth will see the salvation of God.                                                                                                                                                            [Need web hosting? I personally like A Small Orange]
Of Stranger Flames - [indie turn-based rpg set in a para-historical French colony] | Indie RPG development journal


#12 larspensjo   Members   -  Reputation: 1526

Like
0Likes
Like

Posted 06 July 2012 - 12:21 PM

Removed, accidental repetition.

Edited by larspensjo, 06 July 2012 - 12:24 PM.

Current project: Ephenation.
Sharing OpenGL experiences: http://ephenationopengl.blogspot.com/

#13 brx   Members   -  Reputation: 689

Like
1Likes
Like

Posted 06 July 2012 - 01:30 PM

Yes it's possible, yes they need to inherit the same base class.

Sorry, but while everything (except, when looking at the original question, the quoted part) you wrote is correct, the original question was

I'm looking for a feature where you can make a variable contain a class type.

and that is simply not possible in C++.

#14 Servant of the Lord   Crossbones+   -  Reputation: 17972

Like
0Likes
Like

Posted 06 July 2012 - 01:35 PM

Ah, good catch - I had figured that the original poster was just phrasing things poorly from confusion.

(Note: I had previously rated down your initial post because I thought you were needlessly nitpicking technical terms in a troll-like manner (and in the For Beginner's forum too!).
Since I now realize that you weren't trolling, but cannot undo the negative rating, I rated up your most recent post to compensate. My mistake!)

Edited by Servant of the Lord, 06 July 2012 - 02:49 PM.

It's perfectly fine to abbreviate my username to 'Servant' rather than copy+pasting it all the time.

[Fly with me on Twitter] [Google+] [My broken website]

All glory be to the Man at the right hand... On David's throne the King will reign, and the Government will rest upon His shoulders. All the earth will see the salvation of God.                                                                                                                                                            [Need web hosting? I personally like A Small Orange]
Of Stranger Flames - [indie turn-based rpg set in a para-historical French colony] | Indie RPG development journal


#15 brx   Members   -  Reputation: 689

Like
0Likes
Like

Posted 06 July 2012 - 02:12 PM

Didn't mean to nitpick (and certainly not to troll!). But distinguishing between the terms "object" and "class" was absolutely necessary in this case, even though it is the For Beginner's forum (which, btw, I didn't even realize because I mainly use the "New Content" button)

#16 Fredericvo   Members   -  Reputation: 269

Like
0Likes
Like

Posted 06 July 2012 - 02:44 PM

OK I've never been that verbally talented and indeed there's a distinction between class and object (instance of class)
Not sure then what op meant or how my post was wrong but oh well,semantics...
I suppose it would be more correct to say that if OP wants a pointer to a derived instance of a base class then it is possible or is my human language wrong again lol?

#17 fotogames   Members   -  Reputation: 102

Like
0Likes
Like

Posted 06 July 2012 - 02:59 PM

Wow, thanks for all the useful replies! From what I read I conclude that brx is right (after all), sorry for the late reply :P I will read the wikipedia article on Design Patterns, looks very useful :D This is a really awesome forum haha, thanks :D

#18 Matt-D   Crossbones+   -  Reputation: 1424

Like
0Likes
Like

Posted 06 July 2012 - 07:14 PM

You can store types and even perform operations on them (e.g., evaluate conditional expressions where types are given as arguments and types are returned as results) at compile-time using template metaprogramming.
Here in particular, you can use a so-called "instance_of_type" hollow type ("hollow types" -- ones that carry no data, in particular: no data members; I'm using "instance_of_type" term (altthough the book uses "instance_of"), to avoid confusion with the word "instance" you might've heard in OOP ("instance_of_type" is NOT an instance of a class)):
[source lang="cpp"]template &lt;typename T&gt;struct instance_of_type{ typedef T type;};[/source]
For an example, see: http://ideone.com/Hyi5H
Here "typeif<(sizeof(int) > 4), int, double>::type" returns type "int" if "(sizeof(int) > 4)" is true -- otherwise, it returns type "double".
Note that "typeif" itself is implemented in terms of "instance_of_type",
// There are more examples in this book: http://acppmp.blogspot.com/

However, if you want to make a decision based on run-time input (e.g., from the user) -- and it sounds to me that you possibly might -- then take note it won't be suited to your problem, as compile-time is usually quite over by that time ;-)

// EDIT #4390239: OK, code editor hates templates Posted Image

Edited by Matt-D, 06 July 2012 - 07:33 PM.


#19 SiCrane   Moderators   -  Reputation: 9492

Like
0Likes
Like

Posted 06 July 2012 - 10:05 PM

The closest C++ has to a pointer to a class type is the std::type_info class, which you can obtain from the typeid operator. However, you can't use it to instantiate objects of the type. You can use it as the basis of a factory that you implement yourself. Whether that is actually useful depends on what exactly you are trying to accomplish.




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS