0

我对头文件不是很好,但我想使用头文件从文件中读取数据并将数据作为主 cpp 文件中的向量返回。

这是我的 readposcar.h 文件:

#include <fstream>
#include <sstream>
#include <vector>

using namespace std;

int add(void) {

    double a1x, a1y, a1z, a2x, a2y, a2z, a3x, a3y, a3z; // I want all this stuff in vector form
    int i;
    double scale;
    string line; stringstream dum;

    ifstream poscar ("POSCAR");
    for (i=1; i<=5; i++) {
        getline(poscar,line);
        if (i==2) {stringstream dum(line); dum >> scale;}
        if (i==3) {stringstream dum(line); dum >> a1x >> a1y >> a1z;}
        if (i==4) {stringstream dum(line); dum >> a2x >> a2y >> a2z;}
        if (i==5) {stringstream dum(line); dum >> a3x >> a3y >> a3z;}
    }

    vector<double> myvec(3);
    myvec[0] = a1x;
    myvec[1] = a1y;
    myvec[2] = a1z;
    return myvec;
}

这是我的 .cpp 文件:

#include <iostream>
#include <fstream>

#include "readposcar.h"

using namespace std;

int main(void) {
    int nbasis = 2;
    int nkpts = 10;
    vector<double> myvec2(3);
    myvec2 = add();
    cout << "No. of k-points: " << nkpts << endl;
    return 0;
}

这显然是行不通的。有人可以就出了什么问题以及我需要做些什么来使其正常工作提出建议吗?如果我确实在 .h 文件中返回 myvec[2] 而不是整个数组,我只能让它工作。

如果向量不起作用,我不介意将它作为一个数组。是否可以将头文件中的数组初始化为一种全局数组,然后简单地在 .cpp 文件中调用它?

这是我得到的错误:

在 main.cpp:4:0 包含的文件中:

readposcar.h: In function ‘int add()’:
readposcar.h:27:9: error: cannot convert ‘std::vector<double>’ to ‘int’ in return
main.cpp: In function ‘int main()’:
main.cpp:12:15: error: no match for ‘operator=’ in ‘myvec2 = add()’
4

3 回答 3

2

您应该将返回类型add从更改intvector<double>

于 2013-06-29T12:21:07.240 回答
1

您没有返回正确的类型。尝试:

vector<double> add() {
   ...
   return myvec;
}

但是我个人会vector在调用者的范围内传递对的引用并返回布尔成功(可选):

bool add(vector<double> &myvec) {
   ...
   return true;
}

这样可以避免复制成本vector高昂的方法,除非 C++ 编译器能够使用RVO来优化复制操作,在这种情况下,您可以使用前一种方法语义。

(感谢@aryjczyk 和@AlexB 指出最后一点)。

于 2013-06-29T12:20:59.790 回答
0
  1. 调用 getline() 后解析该行。
  2. 将每个解析的值转换为双精度。
  3. 在向量上调用 push_back 以添加双精度。

另外,考虑传递对向量的引用。

因此,您的函数的签名将更改为:

int add( std::vector<double> & values )

这样,您将在从函数返回时避免不必要的复制。

于 2013-06-29T12:23:58.413 回答