c+的正向定义+;类成员函数 我编写了一个小生成器,它从一个树对象结构中输出一个CPP文件中的C++类(类的输出顺序是由树给出的,所以它是固定的)。

c+的正向定义+;类成员函数 我编写了一个小生成器,它从一个树对象结构中输出一个CPP文件中的C++类(类的输出顺序是由树给出的,所以它是固定的)。,c++,class,forward-declaration,C++,Class,Forward Declaration,为了保持简单,我更希望有一种方法将所有内容保存在一个文件中 问题是这些类有时使用成员函数相互交互,并且存在前向声明不起作用的情况 例如: #include <iostream> using namespace std; class B; B* global_b=NULL; class A; A* global_a=NULL; class A { public: A() {} ~A() {} void accessB() {

为了保持简单,我更希望有一种方法将所有内容保存在一个文件中

问题是这些类有时使用成员函数相互交互,并且存在前向声明不起作用的情况

例如:

#include <iostream>

using namespace std;


class B;
B* global_b=NULL;

class A;
A* global_a=NULL;

class A {

    public:
    A() {}
    ~A() {}

    void accessB()
    {
        global_b->setValue(1);
    }

    int getValue()
    {
        return 2;
    }

};

class B {
    public:
    B() : j(0) {}
    ~B(){}

    void setValue(int i)
    {
        j = i + global_a->getValue();
    }
    int j;
};


int main()
{
    global_b = new B();
    global_a = new A();

    global_a->accessB();
    cout << "Hello world!" << endl;
    return 0;
}
#包括
使用名称空间std;
乙级;;
B*global_B=NULL;
甲级;
A*global_A=NULL;
甲级{
公众:
A(){}
~A(){}
void accessB()
{
全局_b->设置值(1);
}
int getValue()
{
返回2;
}
};
B类{
公众:
B():j(0){}
~B(){}
无效设置值(int i)
{
j=i+global_a->getValue();
}
int j;
};
int main()
{
全局_b=新b();
全局_a=新的a();
全局_a->accessB();

cout通常,您会这样做:

class A {

    public:
    A() {}
    ~A() {}

    void accessB();
  ...
};
然后在声明A和B之后的某个地方:

void A::accessB()
{
    global_b->setValue(1);
}

您的全局值可能应该是类静态

要使前向声明工作,您应该指定不带任何内联函数的类。然后在文件的后面,您可以编写:

inline void B::setValue(int i)
{
  j = i + A::global.getValue();
}

+1.不同意将所有内容放在一个文件中就是“保持简单”,这样拆分它们既可以解决问题,也可以让您在想查看接口时查看接口,在想查看接口时查看实现。@Paul:这些类不应该手动编辑。它们是生成的,您需要查看的唯一时间是出现错误时。如果需要,则不需要重新定义有关它的功能或知识。因此,保持它的简单意味着保持低处理。@user1159208:“您需要查看它的唯一时间是,是否有错误”-更重要的是,我们有理由在单独的文件中看不到它。代码生成器生成巨大的源文件是很常见的。我的一位同事参与了一个项目,他们在275000行C(不是C++)中遇到了一个编译器错误)我想当他们开始这么大的时候,我们应该开始称他们为功能失调!