C++ 函数不会改变我的论点[重复]

问题描述 投票:0回答:2

我最近开始使用 Cpp 编程,遇到了一个我无法解决的问题,也找不到合适的答案。

我对为什么当我将参数传递给函数(fillInArray 函数)时很感兴趣 它没有改变任何东西。当在调试器中时,我发现 vectorArray(我想传递的参数)根本没有改变,但是这个函数内部向量上的推回方法似乎有效,它增加了向量的大小。 任何帮助将不胜感激,因为这个问题使我无法继续使用该程序。

header.h

#pragma once
#include<iostream>
#include<string>
#include<vector>

using namespace std;

class header
{

private:
    int numberOfBytes = NULL;
    int number;
    int argument;
    vector<int> vectorArray;
    //std::vector<int> vector2;
    //std::vector<int> vector3;

public:

    header();
    ~header();
    void setBytes(int bytes);
    int getBytes();
    void askForBytes();
    void fillInArray(vector<int> someVector);
    void showArray();
    void negateBytes();
    void menu();
    void addArrays();
    void substractArray();
};

header.cpp

#include "header.h"


header::header()
{
    askForBytes();
    setBytes(number);
    fillInArray(vectorArray);
    //fillInArray(vector2);
    showArray();
    negateBytes();
    showArray();
}


header::~header()
{
}


void header::setBytes(int bytes)
{
    if (bytes % 8 == 0)
    {
        numberOfBytes = bytes;
        cout << "You typed in: " << numberOfBytes << " bytes\n";
    }
    else
        cout << "Wrong argument, number of bytes set to: " << 
        numberOfBytes << " bytes" << endl;

}

void header::askForBytes()
{
    cout << "Plz type in how many bytes: " << endl;
        cin >> number;
}

int header::getBytes()
{
    return numberOfBytes;
}

void header::fillInArray(vector<int> vector)
{
    for (int i = 0; i < numberOfBytes; i++)
    {
        vector.push_back( rand() % 2);
    }

}

void header::showArray()
{
    for (unsigned int i = 0; i < vectorArray.size(); i++)
    {
        cout << vectorArray[i] << "  ";
    }
    cout << endl;
}

void header::negateBytes()
{
    for (int i = 0; i < numberOfBytes; i++)
    {
        if (vectorArray[i] == 0)
            vectorArray[i] = 1;
        else
            vectorArray[i] = 0;
    }
}

/*void header::menu()
{
    cout << "Type argument to do stuff: " << endl << 
        "1 to negate single vector\n 2 to add two vectors\n 3 to minus two vectors\n";
    cin >> argument;
    switch (argument)
    {
    case 1: negateBytes();
        showArray(vector);
        break;
    case 2: addArrays();
        showArray(vector);
        break;
    case 3: substractArray();
        showArray(vector);
        break;
    default: cout << "Wrong argument";
    }
}*/

void header::addArrays()
{
    for (int i = 0; i < getBytes(); i++)
    {
        //if ((vector[i] && vector2[i]) == 1)
        //  vector3.push_back(0);
    //  else if ((vector[i] == 1 && vector2[i] == 0) || (vector[i] == 0 && vector2[i] == 1))
        //  vector3.push_back(1);
    //  else vector3.push_back(0);
    }
}

void header::substractArray()
{
}

zadanie1.cpp = main.cpp

#include "header.h"

void showText()
{
    cout << "text";
}

int main()
{
    header head;

    system("Pause");
    return 0;
}

我还注释掉了我稍后将构建的一些变量和函数。 提前致谢!

c++ function vector visual-studio-2013 arguments
2个回答
1
投票
void fillInArray(vector<int> someVector);

您的函数按值获取向量。这意味着该函数获得您传递给它的向量的copy。它可以对该副本进行操作,但这些更改在外部是不可见的。

如果您希望该函数能够修改调用者的向量,则应该传递一个引用:

void fillInArray(vector<int>& someVector);

(需要在函数定义中进行相同的更改。)


0
投票

如果你通过复制传递一个参数,你不应该奇怪为什么被调用者没有改变复制的对象:
它从来不知道这件事。

C++ 具有避免复制的常量引用 (

const T&
)、允许移动的右值引用 (
T&&
) 和允许修改传递的参数的左值引用 (
T&
)。
(请注意模板中的右值引用可能是转发引用。)

当然,你也可以走C路,也可以指路过

© www.soinside.com 2019 - 2024. All rights reserved.