2013-01-15 44 views
2

關於C++模板機制的一個小問題。假設我們有一個名爲Point的類。現在假設「數據」是一個模板類/容器,只包含T(模板)數據成員。 也就是說,「數據」看上去或多或少是這樣的:模板調用中的C++模板

Template <class T> 
class Data { 
T dMember; 
…….. 
}; 

在main.cpp的文件中使用這個類,現在假設某人和瓶坯以下聲明:

Data<Data<Point>> d; 

我想完全理解如何創建對象。我試圖用編譯器進入類調用,但無濟於事。我知道Data需要初始化Data,所以它自己調用一次,但是它真的在那裏做了什麼?有沒有構造函數被激活?

謝謝 蓋伊

回答

2

我知道數據需要初始化數據,所以它自己調用一次,但它真的在那裏做了什麼?有沒有構造函數被激活?

數據並未真正調用它一次。這是因爲內部數據和外部數據是兩個不同的類。通常,如果編譯器看到Data<Data<Point>>,它首先識別內部部分,即Data<Point>。然後實例化模板,這意味着它創建一個具有模板描述的屬性的類。認識到Data不是一個類是重要的,但是可以用來創建一大堆類的模板。每個類別與其他類別不同,它們是不同的類型,並且彼此之間沒有真正的關係。所以Data<Point>只是一個instanitation模板,它的一類,它具有類似,說同樣的性質,

class Foo { 
    Point dMember; 
    ... 
}; 

我只是把它叫做富。編譯器然後看到Data<Data<Point>>,這也可能是Data<Foo>。它實例化模板再次,這次使用Foo(即它從第一個實例獲得的類)作爲參數。它得到另一個類,原則上完全獨立於第一個,除了它具有第一實例的類型的成員:

class Bar { 
    Foo dMember; 
    ... 
}; 

這就是所有。數據不會自行調用,數據甚至不存在作爲類型。在initalization中被調用的構造函數是Bar的構造函數,它反過來將調用Foo的構造函數。您在Data中定義的構造函數並不是真正的構造函數,因爲位於類模板內的任何東西都是模板本身。所以它是一個構造函數模板,如果你調用Foo和/或Bar的構造函數,編譯器會使用該模板實例化實際的構造函數。數據只是編譯器構建真實類(和成員函數,如果需要的話)的藍圖,它永遠不會出現在那裏去玩或調用或初始化任何東西。

5

這就像在下面的例子中實例化Data2

class Data1 { 
    Point dMember; 
}; 

class Data2 { 
    Data1 dMember; 
}; 

Data2 d; // = Data<Data<Point>> d; 

基本上,Point一個包裹的包裝。

1

數據<點模板>將是:

class Data<Point> { 
    Point dMember; 
    ... 
}; 

數據<數據<點模板>>是:

class Data<Data<Point>> { 
    Data<Point> dMember; 
    ... 
}; 

在第二個,數據<點>被用作任何其他成員變量。

如果數據< T>有一個構造函數,它將被調用兩次。首先用於數據< Point>,因爲它是一個成員變量,並且它們的構造函數被首先調用。然後對於數據<數據<點>>。