仅通过代码中的某些函数传递向量

时间:2012-08-02 17:37:42

标签: c++ function vector

我在环境函数中创建了一个向量调用核和单元格,在c ++中是无效的。然后我调用病毒函数创建一个病毒点矢量。然后,我想要访问病毒调用的另一个函数中的载体细胞核和细胞。是否可以在不必通过病毒功能的情况下调用病毒?如果不是最好的方法是什么?附上是我的代码。提前致谢。另外,我没有在函数中添加所有代码...

    struct point {
        float x;
        float y;
    };
    struct space{
        point point1;
        point point2;
        point point3;
        point point4;
    };

        int gelato(vector<point> & virus,int& times,int& iv, ofstream& data_file)
    {
        int a;
        int b;

        bool nc,cc,cmc;
        for(int i =0; i<virus.size(); i++)
        {
             a = virus[i].x;
             b = virus[i].y;

            nc = nucleus_check(nucleus,a,b); // **Need to call vector cell and nucleus**
            cc = cytoplasm_check(cell,a,b);
            cmc = cell_membrane_check(cell,a,b);
        }
    }

int moves(char n)
{
    int moved;
    int trial;

    if( n =='A')
    {
        moved = rand()%4;
    }
    else if(n=='B')
    {
        moved= rand()%3+1;
    }
    else if(n=='C')
    {
        trial= rand()%4;
        if(trial ==1)
        {
            moves('C');
        }
        else
        {
            moved = trial;
        }
    }
    else if(n =='D')
    {
        trial = rand()%4;
        if(trial == 2)
        {
            moves('D');
        }
        else
        {
            moved = trial;
        }
    }
    else if(n=='E')
    {
        moved = rand()%3;
    }

    return moved;
}   
int v_move(vector<point>& virus, int& iv, ofstream& data_file)
{

        gelato(virus,times,iv,data_file);
}
int rand_in(char a)
{}
void virus( ofstream& data_file)
{

    v_move(virus, iv, data_file);
}
void cell_space(int r)
{

    vector<point>cell;
}
void nucleus_space(int r)
{

    vector<point>nucleus;
}   

void environment() //**Where the vector nucleus and cell are created**
{
    //cell
    cell_space(16)

    //nucleus
    nucleus_space(4);
    //cout<<"Environment"<<endl;
}
int main()
{
    srand(time(NULL));
    data_file.open("data.csv");
    environment();
    virus(data_file);

    return 0;
}

1 个答案:

答案 0 :(得分:0)

我假设您尚未学习/掌握面向对象编程(OOP),并且您希望使用procedural programming paradigm实现您的程序。这没关系,因为C ++支持几种范例并且不会强迫您使用OOP。

由于“单元格空间”和“核心空间”意味着一起用作您称之为“环境”的实体,因此您应该定义一个结合了两者的environment结构:

struct environment
{
    vector<point> cells;
    vector<point> nuclei;
};

准备环境的功能类似于:

void prepare_environment(environment& env, // environment passed by reference
                         int cellCount, int nucleusCount)
{
    prepare_cells(env.cells, cellCount);
    prepare_nuclei(env.nuclei, nucleusCount);
};

void prepare_cells(std::vector<point>& cells, // cell vector passed by reference
                   int cellCount)
{
    cells.resize(cellCount);
    // Do other stuff to initialize cells
}

void prepare_nuclei(std::vector<point>& nuclei, int cellCount) {...}

在您的主体中,您将环境结构传递给需要对其进行操作的函数:

int main()
{
    Environment env;

    prepare_environment(env, 16, 4);
    move_virusus(env);
}

在程序编程范例中,数据与对该数据进行操作的程序分开。数据作为辅助函数链中的参数不断传递是正常的。抵制将数据存储在全局变量中并让您的函数直接访问这些全局变量的诱惑。全局变量导致代码更难以测试,更难以阅读,并且更难以重用。

您应该在执行操作后命名您的程序。名称中应该有某种动作动词,例如: prepare_environment。如果该过程对某种数据进行操作,则该数据的名称将成为该动词的对象,例如, prepare_environment

相反,您应该在他们建模的实体之后命名您的结构。名称中应该有一个名词,例如的 environment

一旦理解了程序编程的原则,我认为你会发现理解面向对象编程更容易。