2014-10-18 6 views
-1

Я недавно начал программировать в Cpp, и я столкнулся с проблемой, которую я не мог решить, и не нашел подходящего ответа.Функция C++ не меняет мой аргумент

Я интересуюсь, почему, когда я передаю и аргумент функции (функция fillInArray) ничего не меняет. Когда в отладчике я обнаружил, что vectorArray (аргумент, который я хотел передать), вообще не изменяется, но метод pushback на векторе внутри этой функции, похоже, работает, он увеличивает размер вектора. Любая помощь будет принята с благодарностью, поскольку эта проблема не позволяет мне перейти к этой программе.

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; 
} 

Я также прокомментировал некоторые переменные и функции, которые я будет строиться позже. Спасибо заранее!

+2

Использовать ссылочный параметр 'void fillInArray (вектор & someVector);' –

+0

Вы заполняете копию 'vector' каждый раз, когда вы используете' fillInArray'. Вот почему вы должны передать его по ссылке. – wowofbob

+0

спасибо большое, это сработало для меня! – TheGalax

ответ

0
void fillInArray(vector<int> someVector); 

Ваша функция принимает вектор по значению. Это означает, что функция получает копию вашего вектора, который вы передаете. Он может работать с этой копией, но эти изменения не видны снаружи.

Вы должны передать ссылку, если вы хотите, чтобы функция, чтобы иметь возможность изменить вектор звонившего: (. То же самое изменение должно быть сделано в определении функции)

void fillInArray(vector<int>& someVector); 

+0

Большое вам спасибо, это сработало для меня, извините за эту ошибку новичка. Я прихожу из java и не знаю об этом. Еще раз спасибо! – TheGalax

0

Если вы передайте аргумент копией, вы не должны удивляться, почему вызываемый пользователь не может изменить объект, скопированный:
Он никогда не знал об этом.

С ++ имеет постоянные ссылки, чтобы избежать копий (const T&), RValue ссылки, позволяющего двигаться (T&&), а также ссылки именующих, позволяющей модификацию переданного аргумента (T&).
(Помните, что loks, как rvalue-reference в шаблоне, может быть ссылкой для пересылки.)

Конечно, вы можете пройти по C-маршруту и ​​пройти по указателю.

+0

Большое спасибо. Я ценю вашу помощь! – TheGalax

Смежные вопросы