0

この質問の正しいタイトルは、「インスタンスを互いに初期化できるクラスの循環依存性」である必要があります。他のインスタンスから初期化できるクラスによる循環依存性

ファイル「Index3i.h」:

Iは、別の及びその逆の「転換」であることを意味し(floatデータフィールドを持つ整数データフィールドとIndex3fとIndex3i)2つのクラスを有する

// #include "Index3f.h" 

class Index3i { 
public: 
    Index3i() 
    : r(0), g(0), b(0) { } 

    Index3i(const Index3i& copy) 
    : r(copy.r), g(copy.g), b(copy.b) { } 

    // Index3i(const Index3f& copy) 
    // : r((int)copy.r), g((int)copy.g), b((int)copy.b) { } 

    // Index3f toIndex3f() { ... } 

    ... 
}; 

ファイル「Index3f.h」:

// #include "Index3i.h" 

class Index3f { 
public: 
    Index3f() 
    : r(0.0f), g(0.0f), b(0.0f) { } 

    Index3f(const Index3f& copy) 
    : r(copy.r), g(copy.g), b(copy.b) { } 

    // Index3f(const Index3i& copy) 
    // : r((float)copy.r), g((float)copy.g), b((float)copy.b) { } 

    // Index3i toIndex3i() { ... } 

    ... 
}; 

私はIndex3iクラスのオブジェクトから初期化してIndex3fクラスのオブジェクトに変換できるようにする必要がありますし、他の方法で。また、は、これらのクラスのヘッダーのみをのままにしておきたいと思います。

コメントされたコンストラクタをコメント解除しようとすると、メソッドとそれには循環依存関係の問題が発生します。もう一つの可能​​な解決策は、いくつかの変換関数を実装し、 "IndexConvert.h"などの3番目のインクルードファイルに入れておくことです。

しかし、他の方法がありますか?ケースに適したソリューションを教えてください。

+0

論理的な問題はここにあると思います。インデックスクラスの浮動小数点バージョンをダウングレードできるようにしようとしています。浮動小数点へのアップグレードをサポートする必要がありますが、intバージョンにダウングレードすることはできません。ダウングレードを強制したい場合は、追加機能を与える必要があります。 – mustafagonul

答えて

2

両方を1つのクラステンプレートにする - 実際には2つの異なるクラスを持つ必要はありません。そうすれば、変換コンストラクタテンプレートを書くことができます:

template <class T> 
class Index3 { 
    T r, g, b; 

public: 
    Index3() : r(0), g(0), b(0) { } 
    Index3(const Index3&) = default; 

    template <class U, class = std::enable_if_t<std::is_convertible<U, T>::value>> 
    Index3(const Index3<U>& rhs) 
    : r(rhs.r), g(rhs.g), b(rhs.b) 
    { } 

    /* rest */ 
};