类中的传递参考
我完全困惑。在这个例子中这是我的课的一部分,我有:类中的传递参考
public:
typedef DoubleLinkedNode<DataType> Node;
private:
const DataType* fValue;
Node* fNext;
Node* fPrevious;
DoubleLinkedNode(): fValue((const DataType*)0){
fNext = (Node*)0;
fPrevious = (Node*)0;
}
这意味着fValue
是const DataType*
,现在我想通过这部分像string
或int
申请/定义数据类型fValue
:
DoubleLinkedNode(const DataType& aValue){
std::cout << " -- " << aValue << std::endl;
}
我很困惑,我必须写什么,为什么?我如何将aValue
定义为我的fValue
?! (注:std::cout << " -- " << aValue << std::endl;
只是为了测试)
由于fValue
是一个指针,而DoubleLinkedNode()的引用,采用一个对象,你需要取消引用指针,就像这样:
DoubleLinkedNode(*fValue);
deref是这样的* f值 – 2011-04-12 12:07:23
我为你编辑它! – 2011-04-12 12:07:50
如果fValue
是一个指针,它需要指向其他地方创建的某个变量。那么,什么代码负责指向价值*fValue
的生命周期?
如果类需要创建本身的价值和fValue
真正需要的是一个指针,它可以使用new
和delete
:
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)
{}
我不太清楚你想在这里做什么,但如果你想构建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;
}
一个侧面说明 - 你不需要投'0' – davka 2011-04-12 12:06:46
目前还不清楚你想要什么做。你想打印'* fValue'吗? – 2011-04-12 12:06:54