2012-05-07 21 views
3

考慮一下:類結構保證是訪問的順序

class Vec3 
{ 
    private: 
     float n[3]; 
    public: 
     float& x; 
     float& y; 
     float& z; 
     Vec3(float x_, float y_, float z_) : x(n[0]), y(n[1]), z(n[2]) 
     { 
      x = x_; 
      y = y_; 
      z = z_; 
     } 
} 

我可以肯定,這樣做:

Vec3 v(1,2,3); 
cout<<reinterpret_cast<float*>(&v)[0]<<"\t"; 
cout<<reinterpret_cast<float*>(&v)[1]<<"\t"; 
cout<<reinterpret_cast<float*>(&v)[2]<<"\t"; 

會給我1 2 3由每個編譯/ OS,爲符合標準?

+0

一旦修復編譯器錯誤,它會在您的編譯器上打印出什麼? – juanchopanza

+3

@juancho:這是你可以想象的最不相關的事情。 – Puppy

+0

@DeadMG我可以想象更多不相干的東西。也許這只是我瘋狂的想象。 – juanchopanza

回答

3

正如在其他答案中所說,這是行不通的,因爲float&。有關標準佈局的詳細解釋,請參閱Standard Layout Classes and Trivially Copyable Types

你可以考慮一個稍微不同的方法:

class Vec3 
{ 
    private: 
     float n[3]; 
    public: 
     float& x() { return n[0]; } 
     float& y() { return n[1]; } 
     float& z() { return n[2]; } 
     Vec3(float x_, float y_, float z_) 
     { 
      x() = x_; 
      y() = y_; 
      z() = z_; 
     } 
}; 

因此,

Vec3 v(1,2,3); 
cout<<reinterpret_cast<float*>(&v)[0]<<"\t"; 
cout<<reinterpret_cast<float*>(&v)[1]<<"\t"; 
cout<<reinterpret_cast<float*>(&v)[2]<<"\t"; 

將打印1 2 3爲所有的編譯器

編輯

您可能還需要ŧ請參閱What are Aggregates and PODs (1st answer)What are Aggregates and PODs (2nd answer)以獲取更準確的信息。

+0

我可以在POD類型上定義一個ctor嗎? –

+0

@Luke C++ 03:不,根據定義,POD類型不能有用戶定義的構造函數。 C++ 11:如果你指定了一個非用戶默認構造函數(即'MyClass()= default;'),你可以爲POD類型定義一個構造函數: 查看我編輯的文章 – Synxis

1

沒有。你的班級不是POD,所以沒有任何保證,AFAIK。

+1

這是最重要的標準佈局屬性(在PODness中包含) – PlasmaHH

+1

@PlasmaHH:但這不是標準佈局要麼(標準佈局要求所有非靜態成員具有相同的訪問說明符,但這有公共和私人成員)。 –

+0

@JerryCofin:正如我所說的,「包含在PODness中」。 – PlasmaHH

5

否。爲了達到這個目的,您需要(至少)一個標準佈局類型。 float&不是,因此Vec3也不是。 (9/7,第一顆子彈)。