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

C++ Passing vectors to an overloaded class - some call statements work, some do not.

本文关键字:语句 调用 有效 无效 向量 重载 C++      更新时间:2023-10-16

我在谷歌花了很多时间,试图弄清楚在main中的调用和includes块中的函数之间使用.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);

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

直接的问题是这个声明

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<int>参数const,因为它们在函数中没有被移动。