簡體   English   中英

構造函數在C ++中重載

[英]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      
}
  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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM