2017-08-29 54 views
3

我期待賦值運算符將被動態地綁定取決於參數類型:動態結合功能取決於在C++參數

struct NumberObject; 
struct NumberString; 

struct DataType 
{ 
    virtual void operator=(DataType& rhs) {}; 
    virtual void operator=(NumberString& rhs) {}; 
}; 
struct NumberObject : DataType 
{ 
    double data = 7; 
    void operator=(DataType& rhs) override 
    { 
     std::cout << "Copying from DataType\n"; 
// The assignment operator that's called is this one. I was hoping it would be the one below. 
    } 
    void operator=(NumberString& rhs) override 
    { 
     std::cout << "Copying from NumberString\n"; 
    } 
}; 
struct NumberString : DataType 
{ 
    std::string data = "7"; 
    void operator=(NumberString& rhs) override{}; 
}; 


int main() 
{ 
    DataType *pDataType1, *pDataType2; 
    pDataType1 = new NumberObject; 
    pDataType2 = new NumberString; 
    *pDataType1 = *pDataType2; // Both pointers are to DataType, I was hoping that the assignment operator taking 
          // NumberString as the right hand side would be called 


    return 0; 
} 

從這個我想,基於C++不能動態地綁定函數參數類型。動態綁定僅在通過對象直接調用函數時發生。所以我想我能做到這一點,但它似乎是一種迂迴的方式:

struct NumberObject : DataType 
{ 
    double data = 7; 
    void operator=(DataType& rhs) override 
    { 
     std::cout << "Copying from DataType\n"; 
     rhs.assignTo(*this); 
    } 
    void operator=(NumberString& rhs) override 
    { 
     std::cout << "Copying from NumberString\n"; 
    } 
}; 
struct NumberString : DataType 
{ 
    std::string data = "7"; 
    void assignTo(NumberObject& lhs) override 
    {// Provided the base class had this 
     lhs.data = atof(this->data.c_str()); 
    } 

    void operator=(NumberString& rhs) override{}; 
}; 

這似乎是一個黑客,看到好像語言能夠動態綁定的,是不是這個東西它可以做容易?這是語言的弱點嗎?還是沒有人關心它?

+0

我還沒有在一段時間寫了CPP,但我很高興我沒有。它真的不是最好的語言,並學習它所有的怪癖需要很長時間..... 一個解決方案可能是總是期望一個字符串。然後你只需要將傳遞的數字轉換爲字符串..... 或者,也許使用模板?對於其他相同的類,有兩個單獨的定義會更好。 – HumbleWebDev

+3

你已經遇到了雙重調度問題。閱讀這個主題。這是一個開始的地方。 https://en.wikipedia.org/wiki/Double_dispatch。 –

+0

@Sahu現在就閱讀。我非常喜歡這種語言,但是它有時候讓我感到非常沮喪,我覺得自己用空指針來做所有事情。 – Zebrafish

回答

0

採用雙調度,這將是:

struct NumberObject; 
struct NumberString; 

struct DataType 
{ 
    virtual ~DataType() = default; 
    virtual void operator=(const DataType&) = 0; 
    virtual void assignTo(NumberObject&) const = 0; 
    virtual void assignTo(NumberString&) const = 0; 
}; 

struct NumberObject : DataType 
{ 
    double data = 7; 
    void operator=(const DataType& rhs) override { rhs.assignTo(*this); } 

    void assignTo(NumberObject& rhs) const override 
    { 
     std::cout << "Copying from NumberObject\n"; 
    } 
    void assignTo(NumberString& rhs) const override 
    { 
     std::cout << "Copying from NumberObject\n"; 
    } 
}; 

struct NumberString : DataType 
{ 
    std::string data = "7"; 
    void operator=(const DataType& rhs) override { rhs.assignTo(*this); } 

    void assignTo(NumberObject& rhs) const override 
    { 
     std::cout << "Copying from NumberString\n"; 
    } 
    void assignTo(NumberString& rhs) const override 
    { 
     std::cout << "Copying from NumberString\n"; 
    } 
}; 

Demo