创建一个无法工作的类数组

时间:2012-08-18 01:02:22

标签: c++

我正在尝试使用向量创建一个类数组,但我认为我在实例化数组时遇到了错误的语法。我得到的错误是:

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 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

使用星号和方括号,您将声明一个指向矢量而不是矢量的指针数组。使用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);

编译器认为您试图在setX上调用vector的原因是由向量重载的方括号运算符也是数组或指针上的有效运算符。

答案 2 :(得分:0)

数组和std::vector是两种完全不同的容器类型。数组实际上是一个固定大小的内存块,其中 - 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;
}

答案 3 :(得分:-1)

这里你所做的是定义一个包含1个 std :: vector *元素的数组,你可能想先阅读更多关于vectorarray的信息。 / p>

定义它的正确方法是:

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

或使用指针,如果这是你想要的

std::vector<A*> objects(2);
objects[0] = new A();
objects[1] = new A();