Confusion about struct in a class

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 28/11/2006 at 05:45, xxxxxxxx wrote:

User Information:
Cinema 4D Version:   9.5-10 
Platform:   Windows  ;   Mac OSX  ; 
Language(s) :     C++  ;

---------
Hi,

it's a simple and basic question, but I can't find a solution. I have the following class (don't ask, why I use my own Vector class, it's part of a physical simulation code, that I want to use as a black box) :

  
class Vector3  
{  
public:  
    union {  
        struct {  
             float x, y, z;                               
        };  
        float m[3];  
    };  
  
    Vector3() { }               // blank constructor  
    Vector3(float x, float y, float z);   // constructor with 3 values  
  
   void add(Vector3 & A);  
    ... // further methods...  
};  
  

The problem is, that I get compiler errors with CodeWarrior in the lines, where I try to access the values with Vector3 v.x:

Error: undefined identifier 'x'...

With VC6 everything is fine!? Any tips?

Thank you.

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 28/11/2006 at 07:00, xxxxxxxx wrote:

Ok, I fixed it with a dirty hack. What do you mean?

  
class Vector3  
{  
public:  
   float x, y, z;  
   float *m;  
  
   Vector3() {m = &x;}   // blank constructor  
   Vector3(float x, float y, float z);   // constructor with 3 values  
   void add(Vector3 & A);  
    ... // further methods...  
};  
  
Vector3::Vector3(float x, float y, float z)  
{  
     this->x = x;  
     this->y = y;  
     this->z = z;  
     this->m = &this-;>x;  
};  
  

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 28/11/2006 at 08:18, xxxxxxxx wrote:

Hmm, I am not sure where the exact problem is or what you actually wanna do. However, I´d use the initialisation list. And &this-;>x is also unnecessary imo as it´s simply x. Also why is m a pointer? no need imo 🙂

Vector3::Vector3(float sx, float sy, float sz) : x(sx),y(sy),z(sz),m(sx) {}

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 28/11/2006 at 09:24, xxxxxxxx wrote:

Some parts of the code access the vector members with myVector.x, myVector.y... and some parts with myVector.m[0..2]. So this is the reason for the use of the union. But if you use a union, you have to struct x, y, z in order to get aligned to the same memory address as the m[3] array. My hack is to make these different accesses possible, since the noname struct causes the compiler errors.

I'm not very familiar with initialisation list. Does your suggestion really do the task, I just described? It doesn't seem, that m is accessable as an array.

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 28/11/2006 at 09:41, xxxxxxxx wrote:

Ah. don´t know why your compiler gives an error. Have you tried naming the struct and accessing it via myVector.structName.x ? That´s how I´d have done it.

The initialisation list is always prefered as it sometimes can save unnecessary constructor calls when initialising within the constructor body. So I am using them a lot.

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 28/11/2006 at 10:46, xxxxxxxx wrote:

accessing it via myVector.structName.x

That would be possible of course. But I told about treating the code module as a black box. I would have to adjust a huge of code files and there are other classes with the same problem...

But thanks for looking and thinking.