C++ 将向量传递给重载类 - 有些调用语句有效,有些则无效。

Posted

技术标签:

【中文标题】C++ 将向量传递给重载类 - 有些调用语句有效,有些则无效。【英文标题】:C++ Passing vectors to an overloaded class - some call statements work, some do not. 【发布时间】:2015-03-19 06:19:36 【问题描述】:

我在谷歌上花了很多时间试图弄清楚如何在 main 中的调用和包含块中的函数之间使用 .h 和 .cpp 文件时传递向量。我成功地使用了类定义。

现在一切正常,直到我想创建一个重载函数。 (我可以用两个不同的类来做这件事,但我必须在我的程序中使用一个重载函数。)

这是我的 writeData.h 文件:

#ifndef WRITEDATA_H
#define WRITEDATA_H

#include <vector>
#include <string>
#include <iostream>
#include <fstream>
using namespace std;

class writeData

public: writeData();
public: writeData(vector<int> & DATAFILE);
public: writeData(vector<int> & DATAFILE, string); 
;
#endif

使用命名空间std的位置;是另一个话题。

这是我的 writeData.cpp 文件:

#include "writeData.h"

writeData::writeData()

    std::cout << "Default writeData" << std::endl;


writeData::writeData(vector<int> & DATAFILE)

    cout << "writeData 1" << endl;

    for (int var : DATAFILE)
    
        cout << var <<endl;
    


writeData::writeData(vector<int> & DATAFILE, string fileName)

    ofstream myfile(fileName);
    cout << "writeData" << endl;
    if (myfile.is_open())
    

        for (int var : DATAFILE)
        
            cout << var << endl;
            myfile << var << endl;
        
        myfile.close();
    

这是我的主要功能:

#include <iostream>
#include <vector>
#include <string>

#include "writeData.h"
using namespace std;


int main()

    string fileName = "test.txt";
    vector<int> items 10, 14, 22, 34 ;

    writeData();//default
    ///////////////////////////////////////////////////
    // the next line is the problem code:
    //writeData(items);//writes to screen only 
    //<<When I uncomment it the compiler Tosses the following:
    // 'items': redefinition;     different basic types
    ////////////////////////////////////////////////////
    writeData(items, fileName);//writes to screen and to file

    cin.ignore();
    cin.get();

违规行是 writeData(items);

任何在线文章的帮助或指点将不胜感激。

【问题讨论】:

另见Wikipedia“最令人头疼的解析” 【参考方案1】:

当前的问题是这个声明

writeData(items);

相同
writeData items;

因此重定义错误。更深层次的问题是您为一个类定义了三个 构造函数,并且似乎试图在不创建命名实例的情况下调用它们。要成功调用传递items 的单参数构造函数,您需要类似

writeData data_writer(items);

或者,您可能需要成员函数或非成员函数。选择将取决于您是否真的想对一个保持某些不变量的类进行建模。成员示例,

class writeData

public: 
  void write_data() const;
  void write_data(const vector<int> & DATAFILE) const;
  void write_data(const vector<int> & DATAFILE, string) const; 
;

然后

WriteData wd;
wd.write_data(items);

非会员示例:

namespace writeData

  void write_data();
  void write_data(const vector<int> & DATAFILE);
  void write_data(const vector<int> & DATAFILE, string); 
;

然后

writeData::write_data(items);

请注意,我已将 vector&lt;int&gt; 参数 const 引用,因为它们没有在函数中被修改。

【讨论】:

谢谢!我还必须在 cpp 文件中添加 void,如下所示 void writeData::write_data() 等。顺便说一句,在类定义中的构造函数末尾使用 const 会导致一些问题,因此将它们取出时一切正常。多年来不必使用 C++ 编写代码,这有助于刷新遥远的记忆。

以上是关于C++ 将向量传递给重载类 - 有些调用语句有效,有些则无效。的主要内容,如果未能解决你的问题,请参考以下文章

将向量传递给C++中的线程函数

将基类向量传递给接受超类向量的函数

将 c++ 向量传递给 python 并返回

将向量的值传递给特征库格式[重复]

在 C++ 中通过引用与按值将向量传递给函数

实验2:函数重载函数模板简单类的定义和实现