2017-07-30 58 views
0

使用它這是我的代碼的簡化版本:如何在一個方法創建一個對象,而在另一個

#include <iostream> 

using namespace std; 

class ClassA { 
    public: 
     void method1A(){ 
      cout << "Hello World." << endl; 
      } 
     void method2A(){ 
      cout << "Bye." << endl; 
      }  
}; 

class ClassB { 
    public: 
     void method1B(){ 
      ClassA objectA; 
      objectA.method1A(); 
      } 
     void method2B(){ 
      objectA.method2A(); 
      } 
}; 

int main() { 
    ClassB objectB; 
    objectB.method1B(); 
    objectB.method2B(); 
    return 0; 
} 

的錯誤是:「對象A」在此範圍內未聲明,我想這是因爲方法「method2B」不能訪問對象「objectA」-yep,我正在學習C++ ^^ - 。如何在不移動「method1B」中的「objectA」對象聲明的情況下工作?

+0

如果有任何答案有幫助,請將其標記爲正確,以便人們知道在未來有相同問題時什麼對您有效。 – Engineero

回答

2

(就像你在method1B做)你需要聲明的成員對象您的方法之外:

class ClassB { 
    public: 
     ClassA objectA; 
     void method1B(){ 
      objectA.method1A(); 
      } 
     void method2B(){ 
      objectA.method2A(); 
      } 
}; 

這樣它就可以通過課堂中的所有內容進行訪問。如果你不希望它可以訪問外部類,使它私人或代替保護:

class ClassB { 
    public: 
     // Your public declarations 
    private: 
     ClassA objectA; 
}; 
+1

謝謝你的回答。我知道這個選項,當然它有效,但我需要在這個方法中聲明對象。正如我所說,這是實際代碼的簡化版本,並且在此代碼中不能這樣做,除非更改很多代碼......也許更改爲「ClassA * objectA = new ClassA;」並使用動態內存? –

+1

@AngelBravoSaenz您總是可以在'method1B()'中爲成員變量賦予一個新值,以便'method2B()'使用'method1B()'中創建的值。 – Galik

2

你有兩個選擇:

  1. objectA作爲ClassB
  2. 成員創建另一個ClassAmethod2B
1

你可以動態地在堆中分配空間用於新ClassA,然後返回一個指向該內存的開始:

#include <iostream> 

using namespace std; 

class ClassA { 
public: 
    void method1A(){ 
     cout << "Hello World." << endl; 
    }; 
    void method2A(){ 
     cout << "Bye." << endl; 
    };  
}; 

class ClassB { 
public: 
    ClassA * method1B(){ 
     ClassA * ObjectA = new ClassA; 
     ObjectA->method1A(); 
     return ObjectA; 
    }; 
    void method2B(ClassA * objectA){ 
     objectA->method2A(); 
    }; 
}; 

int main() { 
    ClassB objectB; 
    ClassA * objectA = objectB.method1B(); 
    objectB.method2B(objectA); 
    delete objectA; 
    return 0; 
}; 

我希望這有助於。

相關問題