chrisは、メンバー関数を使用して次のようにオブジェクトをリセットまたはクリアすることに言及しています。
mylist tmp = classList;
classList.clear();
return tmp;
しかし、そもそもコピーを避けることで、通常はさらにうまくいくことができます。
mylist tmp;
std::swap(tmp,classList);
return tmp;
また、返された変数またはclassList変数のいずれかをいつでも解放することを心配する必要がありますか、それともRIAAがすべてを処理してくれますか?
どこかにいdelete
ない限り、リソースを用意する必要はありません。new
また、使用する場合はnew
、スマートポインターも使用する必要があります。そうすれば、delete
何もする必要がなくなります。
JavaからのC++について理解する最も重要なことの1つは、C++オブジェクトはデフォルトで値に似たオブジェクトであるということです。あれは:
class A {
bool bar_called;
public:
A() : bar_called(false) {}
void bar() { bar_called = true; }
bool has_bar_been_called_on_this_object() { return bar_called; }
};
void foo(A a) {
a.bar();
}
int main() {
A a;
foo(a);
std::cout << a.has_bar_been_called_on_this_object() << '\n';
}
出力は、バーが呼び出されていないa
ことを示します。Javaはポインタを使用しますが、非表示にしようとします。したがって、C ++でポインターを理解すると、物事がより理にかなっているはずです。そうすれば、ポインターを使用しない方法を理解できるようになります。
Object o = new Object(); // Java hides the fact that o is a pointer to an Object, but fails to hide the consequences
Object b = o; // b is a pointer to an object, the same Object o points to.
// Equivalent C++
Object *o = new Object();
Object *b = o;
提示したC++コードから判断すると、Javaでは、次のような質問をします。
mylist tmp = classList;
classList = new mylist();
return tmp;
C++での同等のものは次のようになります。
mylist *tmp = classList; // classList is a pointer to a new'd up list.
classList = new mylist();
return tmp;
ただし、これは理想的なC++ではありません。C ++では、通常、ポインターは使用しません。使用する場合は、スマートポインターを使用します。
std::shared_ptr<mylist> tmp = classList; // classList is a std::shared_ptr<mylist>
classList = std::make_shared<mylist>();
return tmp;
また
std::unique_ptr<mylist> tmp = std::move(classList); // classList is a unique_ptr
classList = std::unique_ptr<mylist>(new mylist()); // careful here, don't go calling a bunch of functions inside the mylist initializer, it's dangerous for reason beyond the scope of this post
return tmp;
しかし、C ++の方法は、実際にはポインターを完全に回避することです。
mylist tmp; // classList is not a pointer at all
std::swap(tmp,classList); // the values of classList and tmp are swapped
return tmp; // tmp is returned by value, tmp has the same value as classList, but is not the same object, tmp and classList are objects, not pointers to objects as they are in Java or in the above C++ examples.