3

私は C++ で継承を正しく実装しようと何年にもわたって円を描いてきましたが、Google は実際には役に立ちません。インターフェイスに大きく依存している C++ に移植している作業中の Java コードがあります。

私はいくつかの遺伝的アルゴリズムのテストベッドを書いているので、特定のタイプに関係なく、そのクラスの任意のタイプをそれらに関連付けることができ、同じ機能を実行できるジェネリック変数が必要です。たとえば、任意の種類のクロスオーバーを変数に格納できる「クロスオーバー」タイプが必要で、同じクロスオーバー メソッドのセットを実行できます。

純粋仮想関数「performCrossover」とのインターフェースを作成しました。これは、一般的な「クロスオーバー」クラスによって継承され、その後、個々のクロスオーバー タイプによって継承されます。

現時点では、リンカは「problem::performCrossover」を再定義していると不平を言っていますが、それはまさに私が必要としているものです。ジェネリック クロスオーバー クラスで関数を純粋仮想化することでこれを回避できますが、インスタンス化することはできません。これもまさに必要なものです。

「crossovername::performCrossover」も変更しようとしましたが、「継承されたメンバーは許可されていません」というメッセージが表示されます。これが私が今いる場所です。

私のインターフェース:

class crossoverinterface {
public:
    virtual genome** performCrossover(genome* firstParent, genome* secondParent) = 0;
};

あらゆる種類のクロスオーバーでインスタンス化できる必要があるジェネリック クロスオーバー タイプ。

class crossover: public crossoverinterface{ 
public:
    crossover() {};
    crossover(int genomeLength, int nObjectives);
    ~crossover();

    genome** preCrossover(genome* firstParent, genome* secondParent);
    virtual genome** performCrossover(genome* firstParent, genome* secondParent);

private:
    genome** solution;
    int genomeLength;
    int nObjectives;
};

サブクラスの例 1:

class simulatedbinarycrossover: public crossover {
public:
    simulatedbinarycrossover(int genomeLength, int nObjectives, double lowerBound, double upperBound);
};

genome** simulatedbinarycrossover::performCrossover(genome* firstParent, genome* secondParent){
    ...code...
}

そして最後に、エラー:「performCrossover」:「simulatedbinarycrossover」で宣言されていないメンバー関数」Intellisense はそれを「継承されたメンバーは許可されていません」と呼びます。

うまくいけば、私はある程度の意味がありました。それは、試して説明するのが本当に面倒な問題です。

すべての提案を歓迎します。

4

1 に答える 1

7

インスタンス化されるすべてのクラス定義で、メソッド プロトタイプを記述する必要があります。

基本クラスで定義されているという事実performCrossoverは、派生クラスで再度定義する必要がないという意味ではありません。

class simulatedbinarycrossover: public crossover {
public:
    simulatedbinarycrossover(int genomeLength, int nObjectives, double lowerBound, double upperBound);

    genome** performCrossover(genome* firstParent, genome* secondParent) ;
};


genome** simulatedbinarycrossover::performCrossover(genome* firstParent, genome* secondParent){
    ...code...
}
于 2012-10-23T13:46:31.650 に答える