[aspectc-user] run-time aspects

Olaf Spinczyk Olaf.Spinczyk at informatik.uni-erlangen.de
Thu Dec 8 11:46:38 CET 2005


Hi,

you can't use aspects to introduce types into the global namespace. 
Right now, introductions can only be used to extend classes.

However, your main translation unit could inlude the aspect header 
explicitely:

--main.cc:
#include "aspect.ah"
int main () {
   asp::B n;
}
--

Olaf

Jamal Siadat wrote:
> Hi,
> Yes, nesting classes within aspect would greatly help. However I do seem
> to have issues when I'm trying to create actual class objects for
> instance:
> 
> int main (){
>        B n;
>   return 0;
> }
> 
> A.h:
> class A{
>  public:
> int a;
> };
> 
> 
> aspect :
> 
> #include "A.h"
> using namespace std;
> aspect asp  {
> class B: public A {
> int m ;
> };
> };
> 
> 
> When I try to compile the main file using the aspect I get:
> A.cc:6: error: invalid statement near token `n'
> So for reason I can't create instances of B. Is there any way to introduce
> B somehow using an aspect? and be able to create instances of it?
> 
> Thanks,
> Jamal
> 
>>Hi,
>>
>>once again I'm not sure what you want to achieve :-(. It sounds as if
>>nested classes might help you. For example, you can declare a class in a
>>class or a class in an aspect:
>>
>>aspect Foo {
>>  class Nested : public A {
>>     ...
>>  };
>>};
>>
>>- Olaf
>>
>>Jamal Siadat wrote:
>>>Hi,
>>>yes that helped to a great extent, but is there any way to "introduce" a
>>>class which is a sub-class of another inside an aspect? In our example
>>>can
>>>I create B inside an aspect say:
>>>
>>>Aspect B : public A {
>>>
>>>// the rest of  is defined here
>>>};
>>>
>>>or alternatively:
>>>
>>>Aspect extend : public A {
>>>// create new class B in here which will be a sub-class of A?
>>>};
>>>
>>>Is any of those two methods possible and will it result in me being able
>>>to instantiate objects of type B?
>>>
>>>Thanks,
>>>
>>>
>>>
>>>>Hi,
>>>>
>>>>the new members of A that are introduced by B and C become ordinary
>>>>members after weaving the aspects. There are neither base classes nor
>>>>derived classes generated. However, you could do something like this:
>>>>
>>>>class B {
>>>>  int y;
>>>>};
>>>>
>>>>aspect B_in_A {
>>>>public:
>>>>  advice "A" : baseclass (B);
>>>>};
>>>>
>>>>This will make the "class B" a public base class of A. You could then
>>>>instantiate B objects without the rest of A.
>>>>
>>>>Alternatively, you could also derive the classes B and C from A. It
>>>>sounds as if this is what you want. However, you don't need any aspect
>>>>for this. If B and C use virtual inheritance, you could even create a
>>>>class that inherits from B and C that contains only one instance of A.
>>>>Of course, you could introduce the base class relationship between B and
>>>>A as well as C and A by baseclass introduction as shown above.
>>>>
>>>>Does that help?
>>>>
>>>>Olaf
>>>>
>>>>
>>>>Jamal Siadat wrote:
>>>>
>>>>>Hi,
>>>>>Here is the second part:
>>>>>if so when I am running the
>>>>>
>>>>>>>program
>>>>>>>can I have:
>>>>>>>B b;
>>>>>>>b.y=5;
>>>>>>>If not, what alternatives would I have so I can just create B type
>>>>>>>at
>>>>>>>run-time like above?
>>>>>>>
>>>>>Which means I would like to create and access objects "B" or objects of
>>>>>"C" since I assume B and C will be created as sub-classes of A when
>>>>>compiled. If not What other alternatives do I have to compile two
>>>>>aspects
>>>>>to extend a class and then create objects of each ?
>>>>>
>>>>>Thanks,
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>>Hi,
>>>>>>
>>>>>>first of all, there are a few syntax errors in your code. For
>>>>>>instance,
>>>>>>aspect B should look like this:
>>>>>>
>>>>>>aspect B {
>>>>>> pointcut add() = "A";
>>>>>> advice add() : int y;
>>>>>>};
>>>>>>
>>>>>>Besides this syntax problem, you could compile both aspects together
>>>>>>with your component code. The weaver will introduce the new members
>>>>>>"y"
>>>>>>*and* "Q" into the class "A".
>>>>>>
>>>>>>Introductions are a means to implement *static* crosscutting.
>>>>>>Therefore,
>>>>>>all instances of A will contain both new members.
>>>>>>
>>>>>>I'm sorry, but I don't understand the second part of your question:
>>>>>>"If
>>>>>>the answer to the first part is yes Then is there any way create
>>>>>>objects
>>>>>>of A, B or C independently?". Could you try to explain it again or is
>>>>>>my
>>>>>>answer already sufficient?
>>>>>>
>>>>>>- Olaf
>>>>>>
>>>>>>
>>>>>>Jamal Siadat wrote:
>>>>>>
>>>>>>>Hi All,
>>>>>>>I just have a couple of questions I was wondering if you may address
>>>>>>>for
>>>>>>>me please:
>>>>>>>first Does AspectC++ suopport the expansion of a particular class by
>>>>>>>two
>>>>>>>different aspects that may be compiled simuntaniously?
>>>>>>>for instance is it possible to have a class "A" and use aspects "B"
>>>>>>>and
>>>>>>>"C" to add some methods/variables to it. ( each of A and B add
>>>>>>>different
>>>>>>>methods and variables).
>>>>>>>
>>>>>>>If the answer to the first part is yes Then is there any way create
>>>>>>>objects of A, B or C independently? Here is an example:
>>>>>>>
>>>>>>>class A{
>>>>>>>A();
>>>>>>>~A();
>>>>>>>int a;
>>>>>>>void b();
>>>>>>>}
>>>>>>>
>>>>>>>aspect B {
>>>>>>>pointcut add() : "A";
>>>>>>>add (): int y;
>>>>>>>//adding integer y to class A
>>>>>>>};
>>>>>>>
>>>>>>>aspect C {
>>>>>>>pointcut addition() : "A";
>>>>>>>addition (): bool Q;
>>>>>>>//adding bolean Q to class A
>>>>>>>};
>>>>>>>
>>>>>>>Can I compile B and C simuntaniously? if so when I am running the
>>>>>>>program
>>>>>>>can I have:
>>>>>>>B b;
>>>>>>>b.y=5;
>>>>>>>If not, what alternatives would I have so I can just create B type
>>>>>>>at
>>>>>>>run-time like above?
>>>>>>>
>>>>>>>Thanks all,
>>>>>>>Jamal
>>>>>>>
>>>>>>>_______________________________________________
>>>>>>>aspectc-user mailing list
>>>>>>>aspectc-user at aspectc.org
>>>>>>>http://www.aspectc.org/mailman/listinfo/aspectc-user
>>>>>>>
>>>>>_______________________________________________
>>>>>aspectc-user mailing list
>>>>>aspectc-user at aspectc.org
>>>>>http://www.aspectc.org/mailman/listinfo/aspectc-user
>>>>>
>>>
>>>_______________________________________________
>>>aspectc-user mailing list
>>>aspectc-user at aspectc.org
>>>http://www.aspectc.org/mailman/listinfo/aspectc-user
>>>
> 
> 
> _______________________________________________
> aspectc-user mailing list
> aspectc-user at aspectc.org
> http://www.aspectc.org/mailman/listinfo/aspectc-user




More information about the aspectc-user mailing list