2014-03-07 42 views
0

由於一些遺留的C代碼,我有以下POD struct定義2D座標;和C++ class以便從它繼承以提供各種操作:初始化是POD的基類struct

struct coord 
{ 
    double x; 
    double y; 
}; 

class CoordClass : public coord 
{ 
    // Contains functions like... 
    const CoordClass& operator+=(const CoordClass& rhs) 
    { 
    x += rhs.x; 
    y += rhs.y; 
    return *this; 
    } 

    double Magnitude() const { return std::sqrt(x*x + y*y); } 
}; 

目前,CoordClass限定了構造:

CoordClass(double xx, double yy) { x = xx; y = yy; } 

鑑於xy是POD基struct coord的成員,是它可以將該構造函數編寫爲初始化列表和空主體?考慮到C++ 03和C++ 11的答案對我很感興趣。

回答

3

在C++ 11可以提供這樣的構造:

CoordClass(double x, double y) : coord{x, y} {} 

在C++ 03也有可能得到一個空的構造體,但我不認爲根本是值得做的事情:

CoordClass(double x, double y) : coord(make_coord(x, y)) {} 

其中make_coord是:

coord make_coord(double x, double y) { 
    coord c = { x, y }; 
    return c; 
} 

它可以是private static方法CoordClass。或者,它可以是一個免費函數,它是static和/或CoordClass.cpp的匿名名稱空間的成員。

0

請嘗試以下

CoordClass(double xx, double yy) : coord { xx, yy } {} 
1

在C++ 11中,如果您爲結構定義默認的默認構造函數,它仍然可以是C++ 11中的POD。 (見Is this struct POD in C++11?

struct coord 
{ 
    double x; 
    double y; 

    coord() = default; 
    coord(double xx, double yy) : x(xx), y(yy) {} 
}; 

現在CoordClass構造變得容易:

CoordClass(double x, double y) : coord(x, y) {} 
+0

啊!而且,雖然我不能使用'= default;'(MSVC),但我認爲用戶定義的默認構造函數類似的結構仍然是_standard-layout_?因此,只要構造函數是'#ifdef __cplusplus'守護,它應該互操作良好? – Chowlett