0

C++ のクラスにいくつかのメソッドを追加する必要があります。「Super_list」と呼ばれる継承を使用して、リストのすべてのメソッドを継承し、独自のメソッドを追加できる新しいクラスを作成しています。

#ifndef SUPER_LIST_H
#define SUPER_LIST_H

#include "my_containter.h"
#include <list>
using namespace std;

class My_Container;

class Super_list: public list<My_Container>
{
 public:
  void new_func1();
  void new_func2();
  void new_func_3();
};
#endif

ここで、新しく作成したクラスを使用しています。

#ifndef my_container_H
#define my_container_H

#include <list> 
#include "super_list.h"
using namespace std;

class Super_list;

class My_container
{
 private:
  Super_list buddy;
};
#endif

継承が正しく行われていないことに関連するエラーが大量に発生しています。このタスクを完了するための助けやその他のアイデアをいただければ幸いです。

ありがとう :)

4

3 に答える 3

2

あなたは循環的な依存関係を持っています:MyContainer知っておく必要がSuper_listあり、逆もまた同様です。この依存関係を断ち切る方法を見つける必要があります。コードでは、前方宣言は完全に不要であることに注意してください。

また、標準ライブラリ コンテナーは public から継承されるように設計されていないことにも注意してください。

依存関係に関しては、他のクラスの完全な定義を必要としないように、クラスの少なくとも 1 つを変更する必要があります。からの公的な継承が問題ないふりをしているstd::list場合、唯一のオプションは、(できればスマートな) ポインターを保持することによってMy_Containerの完全な定義を必要としないことです。SuperList

class My_container
{
 private:
  Super_list* buddy;
}; 

これにより、インクルードを削除できますsuper_list.h

1 つの無関係な警告:using namespace stdヘッダー ファイルを配置するのは良くありません。直接的または間接的に、ヘッダーを含むすべてのコードに using ディレクティブが課されるためです。これはあらゆる種類のトラブルにつながる可能性があります。私は通常、さらに進んで、どこでも使用すべきではないと言います。誰もがそれについて私に同意するわけではありません.

于 2012-11-29T20:17:12.367 に答える
0

エラーメッセージなしでは多くを語ることはできません。

1) 引数を std::list コンストラクターに転送する Super_list でいくつかのコンストラクターを定義したい場合があります。

2) 私がこのようなことをしようとするたびに (または、このようなもので作業するたびに)、それは悪い考えであることが判明しました。カプセル化を維持するには、おそらくいくつかのグローバル関数が必要です。

template<class T>
new_func1(std::list<T> &l)

template<class T>
new_func2(std::list<T> &l)

于 2012-11-29T20:18:51.790 に答える
0

追加機能を得るために本当に継承する必要があるかどうかお尋ねします。リストをクラスのメンバーとして使用してみてください。クラスの変更が容易になるだけでなく、クラスを使用するコードがリストであるかどうかを気にしなくなります。

詳細はこちら

于 2012-11-29T20:22:53.297 に答える