0

私は c++ の学習に取り組んでおり、Java、c# +++ は既に知っています。だから公園の散歩かと思ったけど違う!!私がやろうとしているのは、単純なオブジェクト (「テスト」) を作成することです。ここで、add 関数を使用してベクター「データ」に文字列を追加し、それを印刷する何らかの印刷関数を作成します。下に示すものを作成しようとしましたが、入力をいただければ幸いです:)

Call:
test a;
a.add("blabla");
a.print();

test.h:
class test{
    vector<string>* data;
    std::string str;
public:
    test();
    void add(std::string t);
};

**test.cpp:**
test::test() {
data = new vector<string>;
}

void test::add(std::string t) {
data->pushback(t);
}

void test::print() {
cout << data[0];
}
4

3 に答える 3

2

C++ が Java や C# と異なる基本的なことの 1 つは、C++ ではすべてのクラスが「値クラス」であることです。もう1つは、動的メモリが「手動」であることです。

2 番目のポイントから、電話をかけるたびにnew、誰がいつ電話するかを考えなければならないという事実が分かりますdelete

最初のポイントから、それは値として動作しvectorstringそれらの拡大と縮小を処理するために必要な動的メモリはクラス自体によって管理されます。それらを動的に割り当てる必要はありません。

また、クラスが宣言されているヘッダー (使用されている場所では 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)
//       ^^^^^            ^

tC++11を使用している場合は、push_backに渡した後は不要になるので、

void test::add(std::string t)
{ data.push_back(std::move(t)); }

この場合は使用しないでくださいconst&

于 2012-06-20T19:54:23.200 に答える
0

test::print でベクトルポインタを逆参照するのを忘れたと思います

void test::print() {
    cout << (*data)[0];
}

*で作成されたオブジェクトを削除することも忘れないでくださいnew

于 2012-06-20T20:02:36.807 に答える
0

main メソッドを含むファイルに test.h を含めることを覚えていましたか?

また、コードで行を使用するstd::coutか、行を含める必要がありusing namespace std;ます。

また、ベクトルのプッシュバック方式は でありpush_back()、 ではありませんpushback()

最後に、newコンストラクタでキーワードを使用しているため、次のようなデストラクタも必要になります。

test::~test()
{
    delete data;
}

これは、Java や C# ではなく C++ プログラミングを行う場合に覚えておくべき非常に重要なことです。C++ 実装は自動的にガベージ コレクションを実行しないため、割り当てられたメモリを自分で解放する必要があります。

編集:

また、以下の回答の1つは別の問題を指摘しています。インデックスを作成する前に、ベクトル ポインターを逆参照するのを忘れました。印刷する必要があります(*data)[0]vector話の教訓は、 dataを へのポインターではなくにした方が、間違いなく簡単で良いということvectorです。

于 2012-06-20T19:06:45.643 に答える