2016-05-04 17 views
1

私はAppleとBananaという2つのクラスを持っています。私は、関数callItestAを使ってクラスBananaのiTestA(クラスApple)の値を変更したいと考えています。 ここに私のBanana.cppC++の別のクラスから関数を呼び出す方法は?

#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; 
} 
だ...(値が変更されていない)

を私は、ポインタを使用してみましたが、動作していないようでした

私はあなたが私を助けることを願っています!

EDIT: マイ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

あなたは価値によってリンゴを渡しています。その関数内のリンゴは、パラメータとして渡すリンゴとは別のリンゴです(コピーです)。関数内のリンゴを変更する場合は、参照渡しを使用してください。すなわち、 'void Banana :: callIsetA(Apple&a){a.setItestA(2);}'を使用してください – user463035818

+0

私は実際に実装だけで行くのは難しいので、あなたのヘッダーを見たいと思います。またtobiは正しいです。 –

答えて

0

それを行うには、いくつかの方法があります。今、変数aは両方のクラスであり、あなたは両方のクラスでそれを変更することができます

extern int a; 

:クラスBで

int a = 2; 

:クラスAに

:一つの方法はextern変数(グローバル)を使用します。

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)に 'incomplete type is not allowed'が設定されています。 –

+0

'Banana.h'と' Banana.cpp'は 'Apple.h'を実際にどのように定義するかを定義するために' Apple.h'を含んでいません。そのため、 '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でこのチュートリアルを読むことができます。

幸運を祈る!

関連する問題