C++11;非静态数据成员初始化是否可以访问其他数据成员
C++11; Can non-static data member initializations access other data members?
我真的很喜欢 C# 中的属性的想法,作为一个小的副项目,我一直在修补在 C++ 中实现它们的想法。我遇到了这个看起来相当不错的示例 https://stackoverflow.com/a/5924594/245869,但我忍不住认为 lambda 和非静态数据成员初始化可能使使用一些非常好的语法来实现这个想法成为可能。这是我的实现:
#include <iostream>
#include <functional>
using namespace std;
template< typename T >
class property {
public:
property(function<const T&(void)> getter, function<void(const T&)> setter)
: getter_(getter),
setter_(setter)
{};
operator const T&() {
return getter_();
};
property<T>& operator=(const T& value) {
setter_(value);
}
private:
function<const T&(void)> getter_;
function<void(const T&)> setter_;
};
class Foobar {
public:
property<int> num {
[&]() { return num_; },
[&](const int& value) { num_ = value; }
};
private:
int num_;
};
int main() {
// This version works fine...
int myNum;
property<int> num = property<int>(
[&]() { return myNum; },
[&](const int& value) { myNum = value; }
);
num = 5;
cout << num << endl; // Outputs 5
cout << myNum << endl; // Outputs 5 again.
// This is what I would like to see work, if the property
// member of Foobar would compile...
// Foobar foo;
// foo.num = 5;
// cout << foo.num << endl;
return 0;
}
我可以正常使用我的属性类[参见main((中的示例],但是带有g ++ 4.7的MinGW并不特别关心我将属性用作数据成员的尝试:
property.cpp: In lambda function:
property.cpp:40:7: error: invalid use of non-static data member 'Foobar::num_'
因此,我的属性实现的概念似乎有效,但它可能是徒劳的,因为我无法从我的 lambda 函数访问其他数据成员。我不确定标准如何定义我在这里要做的事情,是我完全不走运,还是我只是没有在这里做正确的事情?
您的属性是与包含对象(Foobar
的实例(不同的对象(property<int>
的实例(。 因此,它的成员函数被传递一个不同的this
,而不是你需要访问num_
- 所以你不能那样做。 如果 lambda 是在 Foobar
的非静态成员函数中定义的,它们将捕获该函数的this
参数,并可以访问封闭对象的成员(明确地,如this->num_
(。 但是 lambda 是在类中定义的,其中非静态数据成员实际上并不存在。 如果 lambda 确实可以访问num_
,那么num_
哪个实例,哪个实例Foobar
,会是那个?
我看到的最简单的解决方案是让属性存储指向封闭对象的指针。 这样,它就可以自由访问其非静态成员。 缺点是声明稍微复杂一些(你必须做property<int, Foobar> num
(,你需要通过传递this
指针来初始化属性。 因此,您将无法在类中执行此操作,它必须在构造函数的初始化列表中,从而否定了 C++11 的数据成员初始化的优势。
此时,lambda 无论如何都可以捕获this
(通过值,而不是通过引用!(,因此,如果您将属性的初始化移动到 Foobar 的构造函数,您的代码实际上只需进行最少的更改:
Foobar::Foobar():
num {
[this]() { return this->num_; },
[this](const int& value) { this->num_ = value; }
}
{
}
有谁知道传递给碰巧调用的任何构造函数的this
是否可用于类定义中的非静态成员初始化? 我怀疑不是,但如果是,同样的结构将在类定义中工作。
- 用于访问容器<T>数据成员的正确 API
- 使用指针访问数组中的对象数据成员
- 友元函数无法访问私有数据成员 (c++)
- 在类 A 中创建类型为 B 类的向量 - 访问数据 [C++] [成员在两个类中都是私有的]
- 访问数据成员(本身是对象)的数据成员,就好像它们是类成员一样
- 使公共数据成员在C++中无法访问
- 有没有办法在C++中循环访问对象的不同数据成员
- 为什么类成员数据必须是静态的才能被模板化类的模板化结构成员访问
- 如何在C++中使用类对象访问指针数据成员
- 通过指针算法访问结构数据成员
- 是否可以访问类数据成员并在析构函数中对它们执行操作?
- 如何在 c++ 中访问类的私有数据成员
- 现代C++编译器是否优化了对类中同一数据成员的重复访问?
- 无法访问派生类函数内的基类的受保护数据成员
- 从私有结构数据成员访问类公共成员函数C++
- 有关C++/组件数据布局、数据成员访问、方法的一般问题
- C++ 共享库不允许静态数据成员访问
- 私人数据成员访问
- OpenCV Mat数据成员访问
- 数据成员访问歧义和菱形继承