-1

これが私がやろうとしていることです。この main()->A->B のように、クラス A のコンストラクターが B のオブジェクトに対して B のコンストラクターを呼び出すようにします。

A.cpp:(Bhを含む)

A::A(){
  B foo;
}

Bh:

class B{
 B(){//some code};
};

しかし、GCC はコンパイルせず、A::B foo has initializer but incomplete typeと言います。私は、コンパイラが A で定義された B のローカル クラスを認識しなかったと推測しているため、クラス B が別のファイルからのものであると不平を言い、知りませんでした。私の質問は、上記のように A のコンストラクターで B のオブジェクトを構築する方法です。C++ に関するいくつかの基本事項が欠けていると確信しています。ご容赦ください。前もって感謝します。

4

2 に答える 2

2

試す

class A
{
    public:
        A();  // Don't define A::A() here
              // As the compiler has not seen B
};
class B
{
    public:
        B() {}
};
// At this point both classes have been seen
A::A()
{
    ::B foo;  // So now you can use B
              // Note I am using ::B here
              //      As the error message suggests that you have some class B defined
              //      Within A which is confusing it. the prefix :: means take the class
              //      B from the global scope rather than a closer scope.
}
于 2012-09-10T03:48:40.833 に答える
1

タイプ のクラスはありませんA::BBあなたのコメントから、それを呼び出してへのポインタを使用しようとしているようですA::B *。これは正しくありません。へのポインターBは、表示される場所に関係なく、常にB *です。あなたが言ったことから、あなたは次のようなものが欲しいようです:

a.hpp

#ifndef A_HPP_
#define A_HPP_

class B;
class A {
public:
    A(B * b);
private:
    B * my_very_own_b;
};

#endif    // A_HPP_

a.cpp

#include "a.hpp"
#include "b.hpp"

A::A(B * b):
    my_very_own_b(b)
    {
}

b.hpp

#ifndef B_HPP_
#define B_HPP_

class B {
public:
    B();
private:
    int x;
};

#endif    // B_HPP_

b.cpp

#include "b.hpp"
B::B():
    x(0)
    {
}

main.cpp

#include "a.hpp"
#include "b.hpp"

int main() {
    B b;
    A a(&b);
    return 0;
}
于 2012-09-10T03:43:27.057 に答える