无法解析标识符push_back

时间:2018-04-23 12:48:51

标签: c++ c++11 netbeans-8

我对C ++向量有一个小问题。 在我的.H文件中我有

class MyClass{ 
private:
    std::vector<myObject> test;
public:
    MyClass();
    add(myObject object);
}

在我的.CPP文件中

MyClass::MyClass(){
    std::vector<myObject> test;
}
MyClass::add(myObject object){
//here is the problem. Netbeans does even giving me quick cast this method i need to write it myself and it throws an error.
    test.push_back(object);
}

我正在使用NetBeans 8,它说&#34;无法解析identfier push_back而且我不知道为什么。我对C ++很陌生并做了一些研究,但似乎我无法找到答案。 我的目标是让.H文件和我初始化.CPP中的向量然后我想要单独的函数,如添加将我的对象推送到包含向量的这个类。类似于您可以添加对象的列表。

感谢您的帮助。

编辑: 是的,我在顶部包含了矢量。

编辑: 这就是代码

   #include <vector>

class MyClass{ 
private:
    int a;
    std::vector<int> test;
public:
    MyClass();
    void add(int n);
};

MyClass::MyClass(){
}

void MyClass::add(int m){
//unable to resolve identifier push_back
    test.push_back(m);
}

int main() {

    MyClass a();
//request for member add in a which is of non class type
    a.add(1);


}

3 个答案:

答案 0 :(得分:2)

您忘记为add方法添加返回类型。 在H中尝试这个:

void add(myObject object);

这在CPP:

void MyClass::add(myObject object){

答案 1 :(得分:2)

int main() {

    MyClass a();
//request for member add in a which is of non class type
    a.add(1);


}
  

//请求成员添加非类型类型

因为a不是MyClass对象。为了使它成为一个,你需要像这样构建它:

MyClass a{};

或者只是这样:

MyClass a;

否则将其视为函数声明。这里编译时没有错误https://ideone.com/y7fQXo

答案 2 :(得分:0)

根据您的“完整”代码(不会显示.h.cpp之间的分界线,但是我告诉您代码已完成),很明显#include代码顶部只有一个.h。我假设.cpp代码以行MyClass::MyClass(){开头,这意味着它没有包含。因此,它没有来自您标头的任何信息,并且通过扩展,没有来自<vector>的信息。

#include <vector>中需要

.h(因为您在类定义中使用了vector),但 还需要#include "myclass.h"(在myclass.cpp中(或者你命名为源文件的任何东西)。或者你命名为头文件的任何东西。

没有它,当编译器正在编译.cpp文件时,它只是在黑暗中磕磕绊绊。它没有MyClass整体的定义,因此不知道testvector<int>类型的成员。不知道test是什么(并且就此而言,不知道vector<int>是什么),它无法解决任何方法。

要使其工作,您需要在.h中包含.cpp,以便编译器具有解释方法定义的声明。如果您的标题名为myclass.h,请添加:

#include "myclass.h"

.cpp的顶部。为了更好地衡量,在源文件中明确#include <vector>也可能有意义;是的,它会通过包含标题的副作用得到它,但是对于双重包含标准库标题(通过包含保护来防止双重包含)在很大程度上是无害的,并且它清楚地说明了你依赖的标准库组件是什么on(对维护者有用)。