3

A および B クラスの前方宣言が機能しないのはなぜですか?

#include <iostream>
using namespace std;

class A, B;    

class A {
public:
    A() {
        new B();
    }
};

class B {
public:
    B() {
        new A();
    }
};

int main () {
    A a = new A();
    B b = new B();
};

コンパイラ エラー:

classes.cpp:4:8: error: expected unqualified-id before ‘,’ token
classes.cpp:4:10: error: aggregate ‘A B’ has incomplete type and cannot be defined
classes.cpp: In constructor ‘A::A()’:
classes.cpp:9:7: error: expected type-specifier before ‘B’
classes.cpp:9:7: error: expected ‘;’ before ‘B’
classes.cpp: In function ‘int main()’:
classes.cpp:22:14: error: conversion from ‘A*’ to non-scalar type ‘A’ requested
classes.cpp:23:4: error: expected ‘;’ before ‘b’
4

3 に答える 3

5

このような:

class A
{
public:
    A();
};

class B
{
public:
    B();
};

A::A() { new B(); }    // terrible code, leaks, serves no purpose
B::B() { new A(); }    // likewise
于 2013-04-01T16:44:04.730 に答える
1

オブジェクトを作成したい場合、その定義はコンパイラーに認識されている必要があります。前方宣言は不完全な型を生成します。前方宣言は、引数を宣言する (関数またはプロトタイプを宣言する) か、ポインターまたは参照の型を返すためにのみ使用します。次のように、オブジェクト定義がわかっている場合は、コンストラクターを宣言して定義するだけです。

class Aa {
public:
    Aa();
};

class Bb {
public:
    Bb();
};

Aa::Aa(){
    new Bb;//do something
}
Bb::Bb(){
    new Aa;//do something
} 

そしてところで:オーバーフローへの無限割り当てスタックに注意してください...

于 2013-04-01T16:53:01.617 に答える