1

ベクトルを使用してクラスの配列を作成しようとしていますが、配列をインスタンス化することで構文が間違っていると思います。私が得ているエラーは次のとおりです。

error: request for member 'setX' in objects[0], which is of non-class type 'std::vector'

#include <iostream>
#include <vector>

using std::cout;

class A {
    public:
        void setX(int a) { x = a; }
        int getX() { return x; }
    private:
        int x;
};

int main() {

    std::vector<A> *objects[1];

    objects[0].setX(5);
    objects[1].setX(6);

    cout << "object[0].getX() = " << objects[0].getX() << "\nobject[1].getX() = " << objects[1].getX() << std::endl;
}
4

4 に答える 4

5
std::vector<A> objects; // declare a vector of objects of type A
objects.push_back(A()); // add one object of type A to that vector
objects[0].setX(5); // call method on the first element of the vector
于 2012-08-18T01:05:45.887 に答える
3

アスタリスクと角括弧を使用して、ベクトルではなくベクトルへのポインターの配列を宣言しています。std::vector<T>角かっこやアスタリスクは必要ありません。

std::vector<A> objects(2); // 2 is the number of elements; Valid indexes are 0..1, 2 is excluded

objects[0].setX(5); // This will work
objects[1].setX(6);

setXaを呼び出そうとしているとコンパイラが判断した理由はvector、ベクトルによってオーバーロードされた角かっこ演算子が、配列またはポインターに対しても有効な演算子であるためです。

于 2012-08-18T01:06:31.727 に答える
1

配列 とstd::vectorは、2 つのまったく異なるコンテナー タイプです。配列は実際には固定サイズのメモリ ブロックですが、std:vectorオブジェクトは動的シーケンシャル コンテナ タイプであるため、実行時に動的に「拡大」および「縮小」することができ、オブジェクト自体がメモリ割り当てを管理します。所有するオブジェクト。明らかな類似点は、どちらも O(1) の複雑さでメンバーにアクセスでき、メンバーにアクセスするためにブラケット構文を使用できることです。

あなたが望むものは次のようなものです:

int main() 
{

    //make a call to the std::vector<T> cstor to create a vector that contains
    //two objects of type A
    std::vector<A> objects(2);

    //you can now access those objects in the std::vector through bracket-syntax

    objects[0].setX(5);
    objects[1].setX(6);

    cout << "object[0].getX() = " << objects[0].getX() << "\nobject[1].getX() = " << objects[1].getX() << std::endl;

    return 0;
}
于 2012-08-18T01:05:46.120 に答える
-1

ここで行ったことは、 std::vector *型の 1 つの要素を持つ配列を定義することです。最初にvectorarrayについて詳しく読むことをお勧めします。

それを定義する正しい方法は次のとおりです。

std::vector<A> objects(2);

または、それが意図している場合はポインターを使用します

std::vector<A*> objects(2);
objects[0] = new A();
objects[1] = new A();
于 2012-08-18T01:13:01.053 に答える