-1

私は2つのクラスAとBを持っています

A.hpp

#include <vector>
#include <algorithm>
#include "B.hpp"

class A {
public:
  void sortTrans() { std::sort(trans_.begin(), trans_.end(), sortStruct); }
  unsigned int name() { return name_; }
private:
  std::vector<B*> trans_;
  unsigned int name_;
};

B.hpp:

class A;

class B {
  A& source_;
  A& dest_;
  unsigned int choice_;
};

今私は選択と名前の値でtrans_をソートしたいので、私は書いた

struct sort {
  bool operator()(B* t1, B* t2) {
    if (t1->choice < t2->choice)
        return true;
    if (t1->dest_.name() < t2->dest_.name())
        return true;
    return false;
  }
} sortStruct;

しかし今、循環依存を壊すという問題に直面しています。A の定義は A.hpp にあり、B の定義は B.hpp にあります。B.hpp では、A の前方宣言を使用し、A には B.hpp が含まれています。しかし、A と B のいずれかの定義を使用するため、sortStruct をどこに (またはどのように) 配置する必要がありますか?そして、常にエラーが発生します。

Wrong usage of forward declaration A

手伝ってくれてありがとう。

4

4 に答える 4

1

両方のヘッダーは、実際にはどちらも他方に依存しない (依存する必要がない) ため、前方宣言を使用できます。

A.hpp

#ifndef A_HPP
#define A_HPP
#include <vector>

class B;

class A {
public:
  void sortTrans();
  unsigned name();
private:
  std::vector<B*> trans_;
  unsigned int attr1_;
  unsigned int attr2_;
};
#endif

B.hpp

#ifndef B_HPP
#define B_HPP_
class A;

class B {
  A& source_;
  A& dest_;
  unsigned choice_;
};
#endif

A.cpp

#include "A.hpp"
#include "B.hpp"
#include <algorithm>

// I can't really define this with your B as given ...
struct SortB {
    bool operator()(B *x, B *y) {
        if (x->choice_ < y->choice_)
            return true;
        if (x->dest_.name() < y->dest_.name())
            return true;
        return false;
    }
 };

void A::sortTrans()
{
    std::sort(trans_.begin(), trans_.end(), SortB());
}

B::choice_ と B::dest_ にアクセスする方法をまだ示していないことに注意してください。これは設計上の決定であり、適切な推測を行うための十分な情報がないためです。

それらを public として公開する (この場合B、 は基本的に構造体です)、アクセサー メンバーを に追加する、またはB.hpp でフレンドとしてB前方宣言することができます。SortB

于 2012-12-12T12:45:41.857 に答える
0

ソート関数はおそらく意図したものではありません。おそらく次のようなものになるはずです

if (b1->choice < b2->choice)
    return true;
if (b1->choice == b2->choice && b1->name < b2->name)
    return true;
return false;

選択できる==演算子がない場合は、<演算子を逆にして否定して、同じ機能を実行する必要があります。

于 2012-12-12T19:03:34.073 に答える
0

の宣言を に、実装を (通常どおり) に配置operator()できB.hppますB.cpp

// B.hpp
class A;

class B {
  A& source_;
  A& dest_;
};

SortB {
  bool operator()(B* a, B* b); // can be implemented in B.cpp
};

SortBについて知る必要性の実装には何もありませんclass A:

// B.cpp
bool SortB::operator()(B* t1, B* t2) {
    if (t1->attr1() < t2->attr1())
        return true;
    if (t1->attr2() < t2->attr2())
        return true;
    return false;
}

コードをA.hpp大幅に変更する必要はありません。

// A.hpp
#include "B.hpp"

class A {
public:
  void sortTrans() { std::sort(trans_.begin(), trans_.end(), SortB()); }
private:
  std::vector<B*> trans_;
  unsigned int attr1_;
  unsigned int attr2_;
};
于 2012-12-12T12:40:00.890 に答える
0

クラスに参照メンバーがある場合は、コンストラクター/コピー コンストラクターを提供する必要があります。Bに提供しましたか

t1->attr2()<t2->attr2()が正しくないことにも気付きました。それはあるべきでt1->attr1_あり、t2->attr2_

于 2012-12-12T12:40:50.163 に答える