[英]Constructor Overloading in C++
我的C ++重載不起作用,因為我認為它應該:
#include "Node.h"
#include <iostream>
Node::Node()
{
cout << "1" << endl;
Node(Game(), 0.0);
}
Node::Node(double v)
{
cout << "2" << endl;
Node(Game(),v);
}
Node::Node(Game g, double v)
{
cout << "3" << endl;
numVisits = 0;
value = v;
game = g;
}
而輸出來自:
Node n(16);
cout << n.value << endl;
是0,應該是16。
我做錯了什么?
Node(Game(),v);
在您的構造函數中沒有按預期執行。 它只是創建一個臨時的而不使用它,並沒有任何效果。 然后當控制流過;時,它會立即破壞那個臨時的。
正確的方法是初始化每個構造函數中的成員。 您可以在私有init()成員函數中提取它們的公共代碼,並在每個構造函數中調用它,如下所示:
class Foo {
public:
Foo(char x);
Foo(char x, int y);
...
private:
void init(char x, int y);
};
Foo::Foo(char x)
{
init(x, int(x) + 3);
...
}
Foo::Foo(char x, int y)
{
init(x, y);
...
}
void Foo::init(char x, int y)
{
...
}
C ++ 11將允許構造函數調用其他對等構造函數(稱為委托 ),但是,大多數編譯器還沒有支持它。
您嘗試使用的功能稱為委托構造函數 ,它是C ++ 0x的一部分。 使用該語法,您的第二個構造函數變為
Node::Node(double v)
: Node(Game(),v)
{
cout << "2" << endl;
}
Node::Node(double v)
{
cout << "2" << endl;
Node(Game(),v); // 1
}
value
。 您還需要了解此臨時對象與原始構造對象完全不同。 但是,您可以通過const引用延長此臨時對象的生命周期,即
Node::Node(double v)
{
cout << "2" << endl;
const Node& extendTemporay = Node(Game(),v);
value = extendTemporary.value ; // Just trivial example;
// You can simply do it by value = v;
}
你可以這樣做,其中init()是一個私有方法:
#include "Node.h"
#include <iostream>
Node::Node()
{
cout << "1" << endl;
init(Game(), 0.0);
}
Node::Node(double v)
{
cout << "2" << endl;
init(Game(),v);
}
Node::Node(Game g, double v)
{
cout << "3" << endl;
init(g,v)
}
void Node::init(Game g, double v)
{
numVisits = 0;
value = v;
game = g;
}
簡而言之:
#include <iostream>
#include "Node.h"
Node::Node()
: game(Game()), value(0.), numVisits(0)
{
std::cout << "1" << std::endl;
}
Node::Node(double v)
: game(Game()), value(v), numVisits(0)
{
std::cout << "2" << std::endl;
}
Node::Node(Game g, double v)
: game(g), value(v), numVisits(0)
{
std::cout << "3" << std::endl;
}
正如大家所說,你不能從構造函數調用構造函數重載。 委托是一個我們將與C ++ 11相遇的升級功能。 輸入的文字不多,不要偷懶。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.