Topic: C++ possible new construct proposal
Author: cag@mnemosyne.cs.du.edu (Chris Gantz)
Date: 11 Apr 91 15:58:03 GMT Raw View
Hello C++ netters,
I don't know if this subject has been address before on the net, but I have
been thinking about a possible C++ implementation of the following Object
Oriented Programming Concept that may be useful for the development of large
systems. The Concept is being able to utilize a "Type" as though it were an
object. This mechanism could be valuable because it would allow a logically
clean way of managing type information. That is, information that is relevant
only to types and not logically relevant to instances of a type. Below is an
example that illustrates a simple declaration and use within the C++ framework.
class X {
type:
private:
// internal data representation for type;
int no_instantiations;
protected:
// protected interface for type;
public:
int instantaitions() {
return instantiations;
}
void update_instantiations() {
no_instantitations++;
}
object:
private:
// internal data representation for objects;
protected:
// protected interface for objects;
public:
X() { // default constructor
update_instantiations()
// object appropriate internal data initialization.
}
~X() { }
void f() { }
};
main()
{
X x_obj;
x_obj.f(); // using x_obj through the object public interface
// below is an example of using the type X as an object...
no_current_instantiations = X.instantiations();
}
I believe that this language inclusion would integrate nicely with what
is already available and not add any new anomalies in the language..
Well I have on my asbestos suit on, so flame away people, but I do hope
that some people will consider the possible addition useful.
Chris Gantz
Dept. of Math & Computer Science Internet: cag@mnemosyne.cs.du.edu
RM 306, JGH cgantz@diana.cair.du.edu
University of Denver cag@aragtap.den.mmc.com
Denver, CO 80208 Voice: (303) 871-3095
Martin Marietta Corp. Internet: cag@airob.mmc.com
M/S XL4370 cag@maxai.den.mmc.com
P.O. Box 1260. cag@aragtap.den.mmc.com
Denver, CO 80201-1260 Voice: (303) 971-3347
--
Chris Gantz Internet: cag@mnemosyne.cs.du.edu
Dept. of Math & Computer Science cgantz@diana.cair.du.edu
University of Denver cag@aragtap.den.mmc.com
Denver, CO 80208 Grad. Student
Author: fuchs@t500e0.telematik.informatik.uni-karlsruhe.de (Harald Fuchs)
Date: 12 Apr 91 12:38:11 GMT Raw View
cag@mnemosyne.cs.du.edu (Chris Gantz) writes:
> class X {
> type:
> private:
> // internal data representation for type;
> int no_instantiations;
> protected:
> // protected interface for type;
> public:
> int instantaitions() {
> return instantiations;
> }
> void update_instantiations() {
> no_instantitations++;
> }
> object:
> private:
> // internal data representation for objects;
> protected:
> // protected interface for objects;
> public:
> X() { // default constructor
> update_instantiations()
> // object appropriate internal data initialization.
> }
> ~X() { }
> void f() { }
> };
> main()
> {
> X x_obj;
> x_obj.f(); // using x_obj through the object public interface
> // below is an example of using the type X as an object...
> no_current_instantiations = X.instantiations();
>
> }
Your proposed addition has been done in C++ version 2.
It's called "static member functions":
class X {
static int no_instantiations;
static void update_instantiations() { no_instantitations++; }
public:
X () { update_instantiations(); }
static int instantiations () { return no_instantiations; }
void f ();
};
main () {
X x_obj;
x_obj.f ();
no_current_instantiations = X::instantiations ();
// or x_obj.instantiations ()
}
--
Harald Fuchs <fuchs@t500e0.telematik.informatik.uni-karlsruhe.de>
Author: cag@mnemosyne.cs.du.edu (Chris Gantz)
Date: 12 Apr 91 18:23:14 GMT Raw View
In article <fuchs.671459891@t500e0> fuchs@t500e0.telematik.informatik.uni-karlsruhe.de (Harald Fuchs) writes:
>cag@mnemosyne.cs.du.edu (Chris Gantz) writes:
>
>> class X {
>> type:
>> private:
>> // internal data representation for type;
>> int no_instantiations;
>> protected:
>> // protected interface for type;
>> public:
>> int instantaitions() {
>> return instantiations;
>> }
>> void update_instantiations() {
>> no_instantitations++;
>> }
>> object:
>> private:
>> // internal data representation for objects;
>> protected:
>> // protected interface for objects;
>> public:
>> X() { // default constructor
>> update_instantiations()
>> // object appropriate internal data initialization.
>> }
>> ~X() { }
>> void f() { }
>> };
>
>
>> main()
>> {
>> X x_obj;
>
>> x_obj.f(); // using x_obj through the object public interface
>> // below is an example of using the type X as an object...
>> no_current_instantiations = X.instantiations();
>>
>> }
>
>Your proposed addition has been done in C++ version 2.
>It's called "static member functions":
>
>class X {
> static int no_instantiations;
> static void update_instantiations() { no_instantitations++; }
>public:
> X () { update_instantiations(); }
> static int instantiations () { return no_instantiations; }
> void f ();
>};
>
>main () {
> X x_obj;
> x_obj.f ();
> no_current_instantiations = X::instantiations ();
> // or x_obj.instantiations ()
>}
>--
>
>Harald Fuchs <fuchs@t500e0.telematik.informatik.uni-karlsruhe.de>
I agree with your above implmentation by utilizing static members. However,
my proposal is not arguing that it can't be done currently, my argument and
the reason for the proposal is that with the above implementation you are
maintaining information within an instance (ie object) that is logical infor-
mation that pertains to "types" and not "objects" of that type. Which can,
in large systems, add to the complexity of the instance (ie objects) when there
is a clear delineation between what is a logical "type abstraction" and what is
an "object abstraction". Also, isn't the object oriented paridigm trying to
make the managment of complexity and modularization of logical entities as
simple as possible?
-Chris (cag@cs.du.edu)
--
Chris Gantz
Dept. of Math & Computer Science Internet: cag@mnemosyne.cs.du.edu
RM 306, JGH cgantz@diana.cair.du.edu
University of Denver cag@aragtap.den.mmc.com
Author: fuchs@t500e0.telematik.informatik.uni-karlsruhe.de (Harald Fuchs)
Date: 13 Apr 91 17:43:03 GMT Raw View
cag@mnemosyne.cs.du.edu (Chris Gantz) writes:
>I agree with your above implmentation by utilizing static members. However,
>my proposal is not arguing that it can't be done currently, my argument and
>the reason for the proposal is that with the above implementation you are
>maintaining information within an instance (ie object) that is logical infor-
>mation that pertains to "types" and not "objects" of that type. Which can,
>in large systems, add to the complexity of the instance (ie objects) when there
>is a clear delineation between what is a logical "type abstraction" and what is
>an "object abstraction". Also, isn't the object oriented paridigm trying to
>make the managment of complexity and modularization of logical entities as
>simple as possible?
Uh? Member functions and static members exist only once, regardless
how many objects you have. So I don't see any addition to complexity.
Whether calling it "static" or "type" variables is just syntactic sugar.
--
Harald Fuchs <fuchs@t500e0.telematik.informatik.uni-karlsruhe.de>
Author: ark@alice.att.com (Andrew Koenig)
Date: 12 Apr 91 13:15:29 GMT Raw View
In article <1991Apr11.155803.5410@mnemosyne.cs.du.edu> cag@mnemosyne.cs.du.edu (Chris Gantz) writes:
> class X {
> type:
> private:
> // internal data representation for type;
> int no_instantiations;
> protected:
> // protected interface for type;
> public:
> int instantaitions() {
> return instantiations;
> }
> void update_instantiations() {
> no_instantitations++;
> }
> object:
> private:
> // internal data representation for objects;
> protected:
> // protected interface for objects;
> public:
> X() { // default constructor
> update_instantiations()
> // object appropriate internal data initialization.
> }
> ~X() { }
> void f() { }
> };
> main()
> {
> X x_obj;
>
> x_obj.f(); // using x_obj through the object public interface
> // below is an example of using the type X as an object...
> no_current_instantiations = X.instantiations();
> }
The first thing that comes to mind is to wonder what your proposal
would do that static members can't? The following works right now:
class X {
private:
// internal data representation for type;
static int no_instantiations;
public:
static int instantiations() {
return no_instantiations;
}
static void increase_instantiations() {
no_instantiations++;
}
static void reduce_instantiations() {
no_instantiations--;
}
private:
// internal data representation for objects;
protected:
// protected interface for objects;
public:
X() { // default constructor
increase_instantiations();
// object appropriate internal data initialization.
}
~X() {
reduce_instantiations();
}
void f() { }
};
int X::no_instantiations = 0;
main()
{
X x_obj;
x_obj.f(); // using x_obj through the object public interface
// below is an example of using the type X as an object...
int no_current_instantiations = X::instantiations();
}
So the question is: what would your proposal do that cannot already
be done just as easily?
--
--Andrew Koenig
ark@europa.att.com