gpt4 book ai didi

c++ - 我可以像命名空间一样使用类作用域,而不是用类名作为前缀吗

转载 作者:行者123 更新时间:2023-12-01 14:57:20 25 4
gpt4 key购买 nike

所以在头文件里面我可以做

namespace X {
doThis();
}
在实现文件中我可以做
namespace X {
doThis() { .... }
}
但如果我有一个类
class X {
public:
doThis();
};
我可以在实现文件中做这样的事情吗
class X {
doThis() { .... }
}
而不是 X::doThis() { .... } ?

最佳答案

有“Java hack”¹,您可以从该类“继承”以使其成员进入您的命名空间:

class MyUserType : /*protected|private*/ X {

void foo() {
doThis(); // works
}
}
当然这只适用于
  • 该类没有定义在继承时会干扰的其他(非静态)特性
  • 您的调用代码位于可以从类型
  • 继承的类中
  • 派生类不是模板,因为两阶段查找使事情再次变得奇怪(尽管您可以使用 using 声明来减轻它们,在逐个名称的基础上)

  • 回复:静态数据成员/类定义外
    在评论中,您似乎主要在代码简洁方面存在问题。调查

    Disclaimer: following examples largely copied from cppreference


  • inline variables (c++17) ,这是关于命名空间级别的静态变量,这也适用于类成员:
    enter image description here
  • constexpr/const 静态成员初始化权在声明中。
    如果整型或枚举类型的静态数据成员声明为 const(而不是 volatile),则可以使用初始化程序对其进行初始化,其中每个表达式都是常量表达式,就在类定义中:
     struct X
    {
    const static int n = 1;
    const static int m{2}; // since C++11
    const static int k;
    };
    const int X::k = 3;
  • constexpr 成员甚至需要在声明中包含初始化程序:
    struct X {
    constexpr static int arr[] = { 1, 2, 3 }; // OK
    constexpr static std::complex<double> n = {1,2}; // OK
    constexpr static int k; // Error: constexpr static requires an initializer
    };
  • 请注意,在某些情况下,您可能仍然需要类外定义,但没有初始化程序:
    如果 const 非内联(C++17 起)静态数据成员或 constexpr 静态数据成员(C++11 起)(C++17² 前)是 odr-used ,命名空间范围内的定义仍然是必需的,但它不能有初始值设定项。即使是多余的,也可以提供定义 (C++17 起)。
    struct X {
    static const int n = 1;
    static constexpr int m = 4;
    };
    const int *p = &X::n, *q = &X::m; // X::n and X::m are odr-used
    const int X::n; // … so a definition is necessary
    constexpr int X::m; // … (except for X::m in C++17)

  • ¹ 长期以来,Java 没有枚举,因此您需要在基类中定义静态常量并从中“继承”以获取常量。
    ² 如果静态数据成员声明为 constexpr,则它是隐式内联的,不需要在命名空间范围内重新声明。这种没有初始化程序的重新声明(以前需要,如上所示)仍然是允许的,但已被弃用。

    关于c++ - 我可以像命名空间一样使用类作用域,而不是用类名作为前缀吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62849159/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com