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{};
};
這似乎是一個黑客,看到好像語言能夠動態綁定的,是不是這個東西它可以做容易?這是語言的弱點嗎?還是沒有人關心它?
我還沒有在一段時間寫了CPP,但我很高興我沒有。它真的不是最好的語言,並學習它所有的怪癖需要很長時間..... 一個解決方案可能是總是期望一個字符串。然後你只需要將傳遞的數字轉換爲字符串..... 或者,也許使用模板?對於其他相同的類,有兩個單獨的定義會更好。 – HumbleWebDev
你已經遇到了雙重調度問題。閱讀這個主題。這是一個開始的地方。 https://en.wikipedia.org/wiki/Double_dispatch。 –
@Sahu現在就閱讀。我非常喜歡這種語言,但是它有時候讓我感到非常沮喪,我覺得自己用空指針來做所有事情。 – Zebrafish