我想知道是否有"固定订单"哪个c ++声明可以做?我正在查看类声明中的声明。
在pascal中,我会考虑使用-const-type-function sequence:
我的类声明与某些用户相反,因为我使用私有保护的公共秩序。但在这些部分中,声明的顺序是否也可以修复?
我想到的是:
type declarations (types, enum, class etc)
friend class
friend functions
static member value
static functions
virtual functions
member function
member value
operators
bitfields
constructors
destructors
using clause
(..plus any I may have missed?)
这背景是我在GUI上工作,允许孩子将项目(例如虚拟功能)拖放到列表中(例如虚拟功能列表) - 所以这些列表的顺序是对我来说很重要。
目前没有固定的订单,按照c ++。但是,如果一个固定的订单可以被证明是有效的,那么它将有助于"转向"用户看到了什么样的"列表"可用,并以最小/最大观看次数将项目放入其中。
我最不确定的一个方面是声明函数和成员值的顺序,因为我不确定某个成员是否可以指向类函数......这是什么类型的事情。我在pascal方面比c ++更强,并且会对此有任何想法吗?
此外,我知道有些用户偏好显示项目的顺序,例如因为他们更喜欢先查看最公开的项目,但在我的情况下,这不是因素,因为GUI可以最大限度地减少部分,使我能够只关注"所需的顺序&# 34;声明。
答案 0 :(得分:0)
没有通用的顺序可以放置这些类型的成员声明。这是类型和反对的反例。常量:
struct One
{
static constexpr std::size_t dim = 4;
typedef float Array[dim];
};
struct Two
{
typedef float Data;
static constexpr std::size_t dataSize = sizeof(Data);
};
如果你考虑decltype
,那么当然任何两种这样的宣言类型都可以在两种方式上相互依赖。
此外,即使是受私人保护的公共秩序也无法修复。考虑这个课程:
struct Something
{
public:
typedef std::pair<int, double> Data;
Data getData() const;
private:
Data prepareData();
};
但是,对于拖放式UI,您可以进一步分离UI表示和类声明。没有什么可以阻止您在UI中呈现这些声明类型,并在从UI生成类定义时根据它们的隐式依赖性散布它们。
是的,它确实需要您解析声明(或以其他方式理解它们)以找出它们的依赖关系,但它是可行的。并且有libclang等工具可用于解析C ++。
它还可以防止使用声明顺序和继承(1)实现的一些高级效果,但这不应该是针对初学者的环境中的问题。
(1)这样一招的例子:
struct Base
{
typedef int Buddy;
};
struct Derived : Base
{
Buddy getInt();
typedef Buddy float;
Buddy getFloat();
};
答案 1 :(得分:0)
这可能是一个可行的解决方案吗?
我已经考虑到需要以任何顺序声明常量和类型,并且必须在其他任何顺序之前完成它们。
此外,代码体不能放在类中的函数声明中。
之后,下面列出的部分可以按照我给出的顺序修复,还是以其他任何/更好的顺序修复?
class t_maybe_this_will_work
{
//1.
// This MUST be first, and allow declarations in ANY order
// constexpr,typedefs,enums,nested classes
//2.
// What is best/only order for these..?
// I have listed them so that functions come before values in case
// functions are referenced?
// friend classes
// friend functions
// using clauses
// static functions
// virtual functions
// virtual operator
// non-static,non-virtual function
// non-static,non-virtual operator
// static value
// non-static value
// bitfield value
// virtual destructors
// non-virtual destructors
// constructors
/* ***** RULE *****
The body of functions are NOT defined within the class.
int not_allowed_body_here (void)
{
// defining some code here...
} ;
*/
} ;