2016-05-04 40 views
1

我有兩個班,蘋果和香蕉。我想用函數callItestA來改變班級Banana中iTestA(蘋果類)的價值。 我嘗試使用指針,但它似乎沒有工作(該值沒有改變)...如何從C++中的不同類調用函數?

這裏是我的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 
+0

你正在通過蘋果的價值。該函數中的蘋果是一個不同於你作爲參數傳遞的蘋果(它是一個副本)。如果你想改變函數中的蘋果,請使用pass-by-reference。即。使用'void Banana :: callIsetA(Apple&a){a.setItestA(2);}' – user463035818

+0

我真的很希望看到您的標題,因爲僅通過實現就很難實現。 tobi也是正確的。 –

回答

0

有一些方法可以做到這一點。一種方法使用的extern變量(全球):

A類

B類
int a = 2; 

extern int a; 

現在變量是在這兩個類,你可以在這兩個類別更改。

什麼是extern? extern關鍵字聲明一個變量或函數,並指定它具有外部鏈接(其名稱可以從定義的文件以外的文件中看到)。 https://msdn.microsoft.com/en-us/library/0603949d.aspx

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); 
} 
+0

如果我使用此解決方案,我收到錯誤消息 對於a.setItestA(2),'不允許不完整的類型'; –

+0

'Banana.h'和'Banana.cpp'都沒有包含'Apple.h'來定義'Apple'的實際外觀,這就是爲什麼'Apple'在'Banana :: callIsetA()中被標記爲不完整類型的原因。 '。 'Banana.h'具有'Apple'的前向聲明,但'Banana'不能用前向聲明聲明'callIsetA(Apple a)',它需要改爲'callIsetA(Apple&a)'。那麼'Banana.cpp'需要包含'Apple.h',所以'callIsetA()'知道'Apple :: setItestA()'以及如何在Apple對象上訪問它。 –

0

在我看來,你在這裏有一些困惑!

在課堂上香蕉,這個代碼僅僅需要一個整數參數,並設置itestA(這是一個全局變量也不香蕉或蘋果甚至一員),以該值:

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

而且你有什麼要做callIsetA?我猜不出

我會再次看看代碼,也許閱讀本教程passing by reference

祝你好運!

相關問題