2010-11-23 4 views
0

私のクラスのメンバで、別のクラスが必要な変数を持っていますが、グローバル変数を使わずにそれらの間で効果的に値を渡すことができます。これは可能な限り避けたいものです。私はオブジェクトを作成することができますが、それはいくつかの関数を実行し、不要な結果をメモリに書き込む、元のクラスのコンストラクタを呼び出すため、システムリソースが無駄になります。C++で新しいオブジェクトを作成せずにクラスから変数を渡すことは可能ですか?

2つの関数の間にこの値を渡す簡単な方法はありますか?


更新:変数を必要としているクラスは、no_of_existing_devicesと呼ばれます。 class Initialiseの目的は、ファイルを開くとそれに含まれるテストの行数をカウントし、各

class Device 
{ 
public: 
    void view_attribute_list(); 
    void set_attribute(); 
    Device(); 
}; 

Device::Device() 
{ 
    for (int count = 0; count < no_of_existing_devices; count ++) 
    { 
    // Create an object for each iteration, up to a maximum of no_of_existing_devices 
    } 
} 

のためのオブジェクトを作成するためにDevice::Device()で使用される変数int no_of_existing_devicesでその数を、配置することですこの変数は、私はメンバーへのポインタを渡すた---私は、メンバ関数を呼び出す必要があったので、メンバ関数へのポインタであった同様の状況において

class Initialise 
{ 
public: 
    int no_of_existing_devices; 
    bool initialisation; 
    string existing_device_list[100]; 

    void initialise_existing_devices(); 
    Initialise(); 
}; 

Initialise::Initialise() 
{ 
    no_of_existing_devices = 0; 
} 

void Initialise::initialise_existing_devices() 
{ 
    string line; 
    ifstream DeviceList; 
    DeviceList.open("devices/device_list"); 
    while (true) 
    { 
     getline(DeviceList, line, '\n'); 
     if (DeviceList.eof()) 
     { 
      break; 
     } 
     ++ no_of_existing_devices; 
    } 
    DeviceList.close(); 

    DeviceList.open("devices/device_list"); 
    for (int i = 0; i < no_of_existing_devices; i ++) 
    { 
     getline(DeviceList, line, '\n'); 
     existing_device_list[i] = line; 
    } 

    Device existing_devices[no_of_existing_devices]; 
    !initialisation; // Existing devices are now initialised 
} 
+1

は今までクラスはそれが含まれているのメンバフィールドであることを意味し、この変数ですか?それはインスタンスの存在に依存するのでしょうか、それとも単独で存在するのでしょうか? – birryree

+0

あなたが達成しようとしていることをより理解できるようにコードを投稿できますか? – pankajt

+0

あなたが達成したいことを理解できるように、より多くのコードを投稿する必要があります。 – Puppy

答えて

1

さて、:

  1. 、あなたが依存関係を導入したくない静的
  2. を持っている必要はありません
  3. グローバルを持っている必要はありません。 Device間と Initialise

一つの他のオプションがあり、を所​​有している何かを想定し0とInitialise、この変数を参照してDeviceInitialiseの両方を構築し、その後、そこまでno_of_existing_devicesを移動...

0

元のクラスの変数がクラスのインスタンスなしで値を保持できる場合、私は変数が静的であると仮定します。そうでない場合は、クラスのパブリック静的メンバーを作成します。そして、それをターゲットクラスで使用します。以下のような 何か:

// .h file 

class A 
{ 
    public: 
     static int a; 
} 

// .cpp file 

int A::a = 123; 

// .cpp file of class B 

void B::foo() 
{ 
    cout << A::a; 
} 
-1

それはクラス属性(内部変数)がある場合は、getメソッドを介して基準を得ることができます。そうでない場合は、属性値にアクセスするクラスのfriendキーワードを使用することができます。たとえば、クラスAにfriend class B;を宣言すると、クラスBの属性はクラスAでアクセス可能になります。

I当然のあなたが参照を通じてアクセスする場合、無駄なリソースがない:)

編集2:使用編集

);あなたは純粋なあなたのコードのOOを維持するために、最初のメソッドを使用することをお勧めInitialiseの静的メソッドは、0を返しますとDeviceクラスのInitialise::NoOfExistingDevices()を呼び出します。リソースは次のようにポインタを使用するようにしたい場合:

public static int* Initialise::NoOfExistingDevices() { 
    return &no_of_existing_devices; 
} 

ところで、私はあなたが変数privateをオンにすることをお勧めします。私が理解から

関連する問題