2011-04-12 133 views
1

我完全困惑。在這個例子中這是我的課的一部分,我有:類中的傳遞參考

public: 
     typedef DoubleLinkedNode<DataType> Node;  
private: 
      const DataType* fValue; 
      Node* fNext; 
      Node* fPrevious; 
      DoubleLinkedNode(): fValue((const DataType*)0){ 
       fNext = (Node*)0; 
       fPrevious = (Node*)0; 
      } 

這意味着fValueconst DataType*,現在我想通過這部分像stringint申請/定義數據類型fValue

DoubleLinkedNode(const DataType& aValue){ 

     std::cout << " -- " << aValue << std::endl; 
    } 

我很困惑,我必須寫什麼,爲什麼?我如何將aValue定義爲我的fValue?! (注:std::cout << " -- " << aValue << std::endl;只是爲了測試)

+1

一個側面說明 - 你不需要投'0' – davka 2011-04-12 12:06:46

+0

目前還不清楚你想要什麼做。你想打印'* fValue'嗎? – 2011-04-12 12:06:54

回答

1

由於fValue是一個指針,而DoubleLinkedNode()的引用,採用一個對象,你需要取消引用指針,就像這樣:

DoubleLinkedNode(*fValue); 
+0

deref是這樣的* f值 – 2011-04-12 12:07:23

+0

我爲你編輯它! – 2011-04-12 12:07:50

1

如果fValue是一個指針,它需要指向其他地方創建的某個變量。那麼,什麼代碼負責指向價值*fValue的生命週期?

如果類需要創建本身的價值和fValue真正需要的是一個指針,它可以使用newdelete

template <typename DataType> 
DoubleLinkedNode<DataType>::DoubleLinkedNode(const DataType& aValue) 
    : fValue(new DataType(aValue)), fNext(0), fPrevious(0) 
{} 
template <typename DataType> 
DoubleLinkedNode<DataType>::~DoubleLinkedNode() { 
    delete fValue; 
} 

但我懷疑的設計可以先制定出更好,如果fValue不是一個指針擺在首位:

private: 
    const DataType fValue; 

// Requires a default constructor for DataType. 
template <typename DataType> 
DoubleLinkedNode<DataType>::DoubleLinkedNode() 
    : fValue(), fNext(0), fPrevious(0) 
{} 
template <typename DataType> 
DoubleLinkedNode<DataType>::DoubleLinkedNode(const DataType& aValue) 
    : fValue(aValue), fNext(0), fPrevious(0) 
{} 
2

我不太清楚你想在這裏做什麼,但如果你想構建DoubleLinkedNode與F值指向安勤的地址(這是PA ssed通過引用構造函數),你需要確定你的構造是這樣的:

DoubleLinkedNode(const DataType& aValue) : fValue(&aValue) { 
     std::cout << " -- " << aValue << std::endl; 
} 

請注意,這不是100%安全要做到這一點,因爲你可能會意外地調用此構造與右值引用(以簡化東西:對函數調用後被破壞的對象的引用)。例如,下面的代碼不會引發編譯錯誤:

std::string s = "Hello "; 
DoubleLinkedNode<std::string> node = DoubleLinkedNode<std::string>(s + "World"); 

即使s + "World"是將構造函數調用後立即銷燬臨時值,現在F值將指向一個無效的內存位置。這是非常糟糕的,因爲在編譯過程中您不會收到任何警告,但是在運行時您會遇到一些非常難以調試的行爲。

因此,它可能是更好地使該預期的指針,而不是引用一個構造函數:

DoubleLinkedNode(const DataType* aValue) : fValue(aValue) { 
     std::cout << " -- " << aValue << std::endl; 
}