2011-04-12 124 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; 
}