オブジェクト指向プログラミングに慣れるために、C++ で単純なリンク リスト クラスとその他のデータ構造を作成したいと考えていました。古い C コードを編集した後、次のようなものができました (関数の 1 つを含めただけです)。
template<typename T> class llist
{
public:
T data;
llist<T>* next;
llist() {next=nullptr;}
llist(const T& d) {data=d;next=nullptr;}
};
template<class T> llist<T>** llistAdd(llist<T> **l,const T& d)
{
llist<T> *temp=*l;
(*l)=new llist<T>(d);
(**l).next=temp;
return &(**l).next;
}
次のように使用されます。
int main()
{
llist<int>* my_integer_list = nullptr;
llistAdd(&my_integer_list,42);
llistAdd(&my_integer_list,128);
llistAdd(&my_integer_list,1337);
for(auto itr = &my_integer_list; (*itr) != nullptr; llistItrAdv(&itr))
cout<<(**itr).data<<endl;
llistClear(&my_integer_list);
return 0;
}
これはすべて完璧に機能します。問題は、C++ OOP スタイルが のような関数の代わりにメソッドを使用することですllistAdd(..)
。問題は、私のコードがポインタ ツー ポインタ、さらにはポインタ ツー ポインタ ツー ポインタで動作することです (「参考文献」を参照llistItrAdv(..)
)。メソッドを使用する場合、次のようなことをする必要があります。
template<typename T> llist<T>* llist<T>::Add(const T& d)
{
llist<T> *temp = new llist<T>(d);
temp->next = this;
return temp;
}
int main()
{
llist<int>* my_integer_list = nullptr;
my_integer_list = my_integer_list->Add(42);
my_integer_list = my_integer_list->Clear();
return 0;
}
ただし、これは見苦しいコードになり、メモリ リークが発生しやすくなります。メソッドでこれを行うより良い方法があるはずですが、私は本当に何も考えられません。ポインター用のメソッドを作成しようとしましたが、C++ では違法です。私のような適切な OOP スタイルの取引クラスについて教えてもらえますか?