编写像C#这样的代码是否合法?

时间:2012-10-11 14:45:08

标签: c++

示例:

ħ

class MyClass {
    int x,y,z;
public:
    MyClass(int,int,int);
    void X();
    void Y();
    void Z();
};

CPP

class MyClass {
    int x,y,z;
public:
    MyClass(int x,int y,int z) {
        this->x=x;
        this->y=y;
        this->z=z;
    }
    void X() {
        printf("x = %d;\n",x);
    }
    void Y() {
        printf("y = %d;\n",y);
    }
    void Z() {
        printf("z = %d;\n",z);
    }
};

使它像C#一样。 不要包含标题,在CPP中重新声明类,但使用方法体。 当文件包含标题时,他从CPP获得extern字段\方法等。

这是合法的吗?我无法预测它的问题。有吗?

3 个答案:

答案 0 :(得分:11)

这属于One Definition Rule的范畴。特别是,针对同一个类的单个程序的多个TU上的多个定义的要求是:

  

[...] - D的每个定义应由相同的令牌序列[...]

组成

(3.2定义规则[basic.def.odr]的第5段)

所以,即使你'修复'第一个版本来声明成员函数inline以匹配第二个版本(其中提供成员的定义隐式声明它们inline),你仍然会遇到冲突此规则:函数体是附加的标记,它们出现在另一个中但不在另一个中。

答案 1 :(得分:5)

一个定义规则部分的3.2 / 5不允许这样做。

  

类类型可以有多个定义(第9条),...... [其他类型和条件并不重要]

     

......并且定义满足以下要求。   鉴于这样一个名为D的实体在多个翻译中定义   单位,然后

     

- D的每个定义应由相同的令牌序列组成;

如果标题包含在任何其他链接的翻译单元中,这明显禁止这样的机制。

如果你想编写C#,只需用C#编写即可。如果您编写惯用的C ++而不是方言,您的未来维护者将非常感激。

答案 2 :(得分:-1)

一个主要问题是循环引用:如果类A的代码包含类B的实例,它本身使用类A,则编译将失败。

将类分离为其声明(.h)和定义(.cpp)可以解决此问题。

但是:如果你仍然希望将类定义放在头文件中,可以通过使类成为模板来实现,从而有效地推迟类型解析。但这是以增加编译时间为代价的!