C++ が Java や C# と異なる基本的なことの 1 つは、C++ ではすべてのクラスが「値クラス」であることです。もう1つは、動的メモリが「手動」であることです。
2 番目のポイントから、電話をかけるたびにnew
、誰がいつ電話するかを考えなければならないという事実が分かりますdelete
。
最初のポイントから、それは値として動作しvector
、string
それらの拡大と縮小を処理するために必要な動的メモリはクラス自体によって管理されます。それらを動的に割り当てる必要はありません。
また、クラスが宣言されているヘッダー (使用されている場所では d である必要があります#include
) と、使用する宣言を含む名前空間 ( a を宣言するusing
か、明示的に呼び出して) にも注意する必要があります。
次のコードは、(単一のファイルで) 必要なことを行います。
#include <vector>
#include <string>
#include <iostream>
class test
{
public:
void add(std::string t);
void print() const;
private:
typedef std::vector<std::string> data_t;
data_t data;
};
void test::add(std::string t)
{ data.push_back(t); }
void test::print() const
{
for(data_t::size_type i=0; i<data.size(); ++i)
std::cout << data[i] << std::endl;
}
int main()
{
test a;
a.add("first");
a.add("second");
a.add("third");
a.print();
return 0;
}
印刷を処理する方法は他にもありcanonical
ます (出力ストリームをパラメーター化し、"a" を別の通常の値として扱う << 演算子のオーバーロードを作成することにより)。しかし今、このコード (あなたのコードに最も似ている) をあなたのコードと比較して、構文的に違うだけではないものを見つけてください。
編集
C++11 を使用しているかどうかはわかりません... 2 つの拡張機能があります。
C++03 にこだわると、
void add(sd::string t)
次のようにより適切にパラメータ化できます
void add(const std::string& t)
// ^^^^^ ^
t
C++11を使用している場合は、push_backに渡した後は不要になるので、
void test::add(std::string t)
{ data.push_back(std::move(t)); }
この場合は使用しないでくださいconst&
。