2017-08-29 4 views
3

内の引数に応じて機能への結合:私はC++が動的に基づいて機能を結合することができないことを推測し、このことからダイナミック私は代入演算子動的引数の型に応じて、バインドする期待していた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; 
} 

を引数型。動的バインディングは、オブジェクトを通して直接関数を呼び出すときにのみ発生します。だから、私はこれを行うことができると思ったが、それは回り道のように見えるん:

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を書いていないが、私は私が持っていないうれしいです。それは実際には言語の中で最も素敵ではなく、そのすべての癖を学ぶのに長い時間がかかります..... 1つの解決策は、ただ常に文字列を期待することかもしれません。その後、渡される数値を文字列に変換するだけで済むでしょう..... あるいは、テンプレートを使用していますか?そうでなければ同じクラスの2つの別々の定義を持つよりも良いでしょう。 – 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

関連する問題