3

为了诱导类似 C#/Java 的语法,通过预处理命令重新定义 C++ 访问修饰符可能会产生什么影响?

#include <iostream>

// The access modifiers are redefined here.
#define public public:
#define protected protected:
#define private private:

class Halo
{
    public Halo(int xx)
    {
        x = xx;
    }

    public int getX()
    {
        return x;
    }

    private int x;
};

int main()
{
    Halo* halo = new Halo(3);

    std::cout << halo->getX();

    return 0;
}
4

3 回答 3

9
class B : public A {};

expected '{' before ':' token
expected unqualified-id before ':' token
expected class-name before ':' token

于 2012-12-21T00:28:01.473 回答
3

除了已经提到的语法错误的后果。这样做会让其他人感到困惑。很久以前,人们会用 Pascal 进行编程,然后在转向 C 时使用#define BEGIN {and #define END },这导致代码看起来有点像 pascal,但当然在许多其他方面根本不像 pascal。

您正在使用不同的语言进行编程。那么,为什么要假装它不是。

我猜是因为您认为是 Java 才忘记删除您的光环对象?

于 2012-12-21T00:31:13.917 回答
2

任何事情都可能发生,因为重新定义语言关键字是未定义的行为。

一般来说,您应该为您使用的语言编写惯用代码。如果您想使用 Java/C# 语法,只需用这些语言编写代码。

于 2012-12-21T00:32:51.953 回答