如何从c ++中的不同类调用函数?

时间:2016-05-04 20:59:39

标签: c++ function class variables call

我有两个班,Apple和Banana。我想用函数callItestA更改班级Banana中iTestA(类Apple)的值。 我尝试使用指针但它似乎不起作用(值没有改变)......

这是我的Banana.cpp

#include "Banana.h"
#include <iostream>
#include <fstream>

using namespace std;

//Konstruktor
Banana::Banana()
{
    cout << "i'm a banana" << endl;
}

//Destruktor
Banana::~Banana()
{
}

//write test
void Banana::writeBanana(){
    ofstream myfile;
    myfile.open("banana.txt", fstream::in | fstream::out | fstream::app);
    myfile << "more bananas\n";
    myfile.close();
}

void Banana::callIsetA(Apple a){
    //set iTestA in class Apple to 2
    a.setItestA(2);
}

和Apple.cpp

#include "Apple.h"
#include <iostream>
#include <istream>
#include <fstream>

using namespace std;

int itestA = 0;

//Konstruktor
Apple::Apple()
{
    cout << "i'm an apple" << endl;
}

//Destruktor
Apple::~Apple()
{
}

//write test
void Apple::writeApple()
{
    ofstream myfile;
    myfile.open("apple.txt", fstream::in | fstream::out | fstream::app);
    myfile << itestA;
    //myfile << "more apples\n";
    myfile.close();
}

void Apple::setItestA(int i)
{
    itestA = i;
}

我希望你能帮帮我!

编辑: 我的Banana.h

#ifndef BANANA_H
#define BANANA_H

class Apple;

class Banana
{
public:
    Banana();
    ~Banana();
    void writeBanana();
    void callIsetA(Apple);
};

#endif

和Apple.h

#ifndef APPLE_H
#define APPLE_H

class Banana;

class Apple
{
public:
    Apple();
    ~Apple();
    void writeApple();
    void setItestA(int i);
private:
    int itestA;
};

#endif

3 个答案:

答案 0 :(得分:1)

问题是您将Apple实例的副本传递给该函数。所以这段代码改变了复制对象的值。

void Banana::callIsetA(Apple a){ //here is the definition of argument copy, next code will change it but not the object that was passed in to the function as initial argument
    //set iTestA in class Apple to 2
    a.setItestA(2); 
}

要更改原始对象的值,您需要传递其引用。这可能如下所示:

void Banana::callIsetA(Apple& a){
    //set iTestA in class Apple to 2
    a.setItestA(2);
}

答案 1 :(得分:0)

有一些方法可以做到这一点。单向使用外部变量(全局):

在A班:

int a = 2;
B级

extern int a;

现在变量a在两个类中,您可以在两个类中更改它。

什么是extern?  extern关键字声明一个变量或函数,并指定它具有外部链接(其名称可以从其定义的文件以外的文件中看到)。 https://msdn.microsoft.com/en-us/library/0603949d.aspx

答案 2 :(得分:0)

在我看来,你在这里有一些困惑!

在Banana课程中,这段代码只需要一个整数参数,并将itestA(这是一个全局变量,甚至不是Banana或Apple的成员)设置为该值:

void Apple::setItestA(int i){
itestA = i;
}

你想在callIsetA做什么?我无法猜测

我会再次仔细查看代码,也许可以在passing by reference上阅读本教程。

祝你好运!