0

为什么我l->set(new StateB);进不去StateA?(此行在下面注释)

它说:

main.cpp: In member function ‘virtual void StateA::writeName(Lap*, char*)’:
main.cpp:19:4: error: invalid use of incomplete type ‘struct Lap’
main.cpp:3:7: error: forward declaration of ‘struct Lap’

但我无法解决:(

#include <stdio.h>

class Lap;
class State;
class StateB;
class StateA;

class State { public:
    virtual void writeName(Lap *l, char *str) = 0;
};
class StateB : public State { public:
    void writeName(Lap *l, char *str) {
        printf("%s B\n", str);
    }
};
class StateA : public State { public:
    void writeName(Lap *l, char *str) {
        printf("%s A\n", str);
        //l->set(new StateB);
    }
};
class Lap { public:
    State *ss;
    Lap(){
        printf("[Lap]\n");
        set(new StateA);
    }

    void set(State *s){
        ss = s;
    }

    void writeName(char *str){
        ss->writeName(this, str);
    }
};

int main()
{
    printf("\n\n");

    Lap lap;
    lap.writeName((char*)"Fulano");
    lap.writeName((char*)"Fulano");

    printf("\n\n");
    return 0;
}
4

1 回答 1

3

问题是前向声明

class Lap;

仅告诉编译器存在这样的类并允许您声明指向 的指针Lap,但它没有为编译器提供足够的信息来处理任何Lap方法调用。

因此,您需要在尝试使用其方法之前进行Lap 完全声明。

使用给定的代码,这不能在单个文件中完成,因为Lapwhilenew StateA调用StateA了一个方法Lap- 循环依赖。

您需要将至少一个(最好是全部)的声明移到头文件中,并在需要的地方包含头文件。然后编译器将在任何一个类的定义尝试使用另一个类中的方法之前知道类的完整接口细节。

于 2012-05-23T00:02:31.723 回答