インスタンスを作成したいクラスがインスタンスを作成しているクラスの次に宣言されていても、クラスから別のクラスのインスタンスを作成することができます。 C#とJavaのように。 これはC++で可能ですか?
は、私はあなたがこのような何かを意味推測答えて
です。あなたは前方宣言が必要です。
#include <iostream>
class B;
class A {
public:
void hello(B &b);
void meow();
};
class B {
public:
void hello(A &a);
void woof();
};
void A::hello(B &b) { b.woof(); }
void A::meow() { std::cout << "Meow!" << std::endl; }
void B::hello(A &a) { a.meow(); }
void B::woof() { std::cout << "Woof!" << std::endl; }
int main() { A a; B b; a.hello(b); b.hello(a); return 0; }
ここで重要な点は、完全に定義されるまで、クラスへのポインタまたは参照のみを使用できることです。だから、私が与えた例では、Aのhello()メソッドは、と宣言されていることがあります。はBを参照していますが、その時点でBを定義していません。しかし、Bの定義の後、A :: hello()メソッドのの定義は、Bが気に入ったように自由に使用できます。
ありがとう:
コンパイラはクラスA をコンパイルするのsizeof(B)を知っている必要があるので、これはC++では不可能であるclass B; //Forward declaration
class A
{
private:
B b;
};
class B
{
};
あなたが何ができるか解決策として、次のとおりです。
class B; //Forward declaration
class A
{
public:
A();
~A();
private:
B* m_pB; //Store a pointer to B
};
class B
{
};
A::A()
{
m_pB = new B; //Create an instance of B
}
A::~A()
{
delete m_pB; //Explictly deallocate the memory.
m_pB = NULL;
}
はい私はそれを知っています。そのクラスの公開変数または関数にアクセスしたい場合はどうすればよいですか? –
しかし、反対側(AをBの直下)はコンパイルがうまくいきます。 –
@maxx:コンパイラは前方宣言を使ってクラスBと呼ばれるものがあることを知っていますが、それは可能ではありませんが、その内容は分かりません。 – Naveen
あなた一度前方declaヘッダーのre Bを使用すると、.cppファイル内でそれを使用して、パブリック変数とメソッドにアクセスすることができます。
C++の実例を教えてください。ありがとうございます –
いくつかの目的のために前方宣言を使用できますが、実際に使用するときは完全な型を持つ必要があります。問題へのより簡単なアプローチがあるので、あなたが本当に達成したいことをより具体的に質問することをお勧めします(注文が重要な場合は、クラスAとクラスBの間の循環依存性を示す可能性があります。良い)。
class B;
class A
{
public:
A(B b, B* bp, B& br) : bp_(bp), br_(br) {} // ok, incomplete types can be used as argument types
B f()
// { return B(); } // nok: cannot create objects of incomplete type
;
B* f2() { return bp_; } // ok
B& f3() { return br_; }; // ok
void g()
// { bp_->g(); br_.g(); } // nok: cannot call methods of an incomplete type
;
void g(B const & b)
// { b.g(); } // nok: cannot call methods of an incomplete type
private:
B * bp_; // ok (also const version)
B & br_; // ok (also const version)
// B b_; // nok: B must be a complete type here
};
class B { // A is complete, any use is correct here
void g() {}
};
// From here on, B is a complete type and can be used in any possible way
B A::f() {
return B(); // ok, now B is complete
}
void A::g() {
br_.g(); // ok, B is complete here
bp_->g(); // ok, B is complete here
}
void A::g(B const & b) {
b.g();
}
- 1. ファイルシステムの仮想化 - これはC#/ .NETで可能ですか?
- 2. 名前でC#のデフォルトパラメータがこれは可能ですか?
- 3. C#Genericsでこれは不可能ですか?
- 4. これはSubsonicで可能ですか
- 5. これはソケットで可能ですか?
- 6. これはJavaScriptで可能ですか?
- 7. これはMagentoで可能ですか?
- 8. これはCSSで可能ですか
- 9. これは可能ですか? Cの配列
- 10. ルア、これは可能ですか?
- 11. これはシリアル化可能ですか?
- 12. Javascript:これは可能ですか?
- 13. これは可能ですか?
- 14. MongoDBクエリ - これは可能ですか?
- 15. Azureポイントツーサイト - これは可能ですか?
- 16. これは可能ですか?
- 17. C++可変マルチタイプは可能ですか?
- 18. C#7.0でデコンストラクタをオーバーロードすることは可能ですか? C#7.0では
- 19. C++でアプレットを使用することは可能ですか
- 20. Eigenをcで使用することは可能ですか?
- 21. C#でMSオフィスをプログラミングすることは可能ですか?
- 22. cでシリアルポートクラスを使用することは可能ですか?
- 23. Cでオブジェクトメソッドをエミュレートすることは可能ですか?
- 24. Turbo C++でPDFファイルを開くことは可能ですか?
- 25. vb.netやC#でアセンブリコードを書くことは可能ですか?
- 26. C++ではopIndexAssignが可能ですか?
- 27. これはWordPressニュースレターで可能です
- 28. これらの機能はWindows Phone 7で可能ですか
- 29. これをシングルクエリで行うことは可能ですか?
- 30. C#.NET Winforms:Label.Autosizeをオーバーライドすることは可能ですか?
ちょっとこれは本当に助けて! –
"完全に定義されるまでは、クラスへのポインタまたは参照のみを使用できます"。あなたが知っている限りでは、関数との間で値渡しのクラスを渡すこともできます... – SadSido
その_deciphering_の賞はどこにありますか? – bobobobo