【问题标题】:How to pass arrays to functions? Using C++ as OO class如何将数组传递给函数?使用 C++ 作为 OO 类
【发布时间】:2014-03-07 03:01:28
【问题描述】:

我正在尝试更好地了解在 C++ 中使用数组。我正在使用面向对象的方法来执行此操作,所以我确实有一堂课。我在一个函数中接受用户输入到字符串数组中,并尝试在另一个函数中打印输出。我在打印或传递输出时遇到了一些困难。如何将字符串数组作为参数传递给另一个函数?我知道 C++ 使用指针和地址。在调试程序时,我看到只有数组地址被传递给打印函数。如何获取要传递给输出函数的实际数组值?我的三个文件在下面...

我的主要...

#include <iostream>
#include "ElectionResults.h"
#include <string>

using namespace std;

void main()
{
    string candidates[5];

    ElectionResults election;

    election.enterElectionData();
    election.displayElecionData(candidates);

    cin.ignore();
    cin.ignore();
}

我的 CPP 文件...

#include "ElectionResults.h"
#include <iostream>

using namespace std;

ElectionResults::ElectionResults(void)
{
}

void ElectionResults::enterElectionData(void)
{
    for (int i = 0; i < 5; i++)
    {
        cout << "Candidiate number " << i + 1 << ": ";
        cin >> candidates[i];
    }
    cout << endl;
}

void ElectionResults::displayElecionData(string candidates[5])
{
    for (int i = 0; i < 5; i++)
    {
        cout << "Candidate name " << i + 1 << ": " << candidates[i] << endl; 
    }
    cout << endl;
}

ElectionResults::~ElectionResults(void)
{
}

我的头文件...

#ifndef ELECTIONRESULTS_H 
#define ELECTIONRESULTS_H

#include <string>
using namespace std;

class ElectionResults
{
    private:
        string candidates[5];

    public:
        void enterElectionData();
        void displayElecionData(string candidates[5]);

        ElectionResults(void);
        ~ElectionResults(void);
};

#endif

谢谢

【问题讨论】:

  • 你不能将数组传递给函数。
  • @user3286380 这不是真的
  • @smani 它是真的。数组作为参数传递时会衰减为指针。您可以将指针和引用传递给数组,但不能传递数组本身。
  • @smani:100% 正确。
  • 哦,对了,我误解了 user3286380 想说什么。对此感到抱歉。

标签: c++ arrays class oop parameters


【解决方案1】:

您可以使用绑定数组参数语法

void displayElecionData(string (&candidates)[5]);

在这种情况下(正如 Ben Voigt 指出的那样),数组不会衰减为指针(即使 [] 只是语法糖),您可以在编译时确保只有5 个元素可以传递给你的函数

【讨论】:

  • std::array 将是更精确的等价物
  • 在这种情况下,数组不会衰减为指针。在修复之前无法 +1 这个答案。
  • @BenVoigt 刚刚在以这种方式传递给函数的数组上使用了 std::begin(ar) 。既然它编译你一定是对的(它不能编译指针)。
【解决方案2】:

没有 my_array.size() 或类似函数,因此您需要将大小存储在某处,并将其作为参数发送到每个采用数组的函数中,除非您有非常明确的数组。但是,在我看来,有一种更好的方法可以做到这一点。使用 std::vector 或 std::array。

#include <vector>
#include <string>

void doStuff(std::vector<std::string>& lines) {
    for(int i = 0; i < lines.size(); ++i) {
        //do stuff to lines[i]
    }
}
int main() {
    std::vector<std::string> my_lines;
    doStuff(my_lines);
    return 0;
}

我建议您学习如何使用原始数组,然后改用 std::vector 或 std::array。从长远来看,它很可能会减少错误和问题。

如果其他人对数组和指针之间的区别感到好奇,我发现这个答案很有启发性:https://stackoverflow.com/a/1049535/197657

【讨论】:

  • 在 C++ 中,数组或多或少是指针 - 不,它们不是。哦,不要听这个。和std::string* lines。啊。我会把那一点完全撕掉。
  • 删除了关于相等和可怕版本的部分,我不知道 Nikos 发布的绑定数组语法。
【解决方案3】:

您的实际问题似乎与将数组传递给函数无关,而是您缺少一些基本的东西。

在enterElectionData 函数中,您正在读取类成员candidates 的输入,但在函数displayElecionData 中,您正在打印参数candidates,它是从主函数传递的,它从未被赋予任何值.

在displayElecionData函数candidates参数中隐藏成员candidates,更具体地说,您可以使用this关键字访问类成员(例如this-&gt;candidates)。或者直接删除不需要的参数。

如果这是您面临的问题,那么您需要熟悉类的基本概念(实例成员及其范围等)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 2016-07-21
    • 2016-11-05
    相关资源
    最近更新 更多