gpt4 book ai didi

c++ - C++模板成员指针属性实现的一些问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:39:25 24 4
gpt4 key购买 nike

我的目标是像在 C# 中一样在 C++ 中创建属性 - 具有重要的设置/获取行为。在这里,Property 的对象包含对 prop 及其 set/get 方法的 master 的引用。

Property.h的实现、内容:

#include <iostream>

using namespace std;

namespace First {

template <class Master, class Type>
struct Property
{
Master &master;

const Type (Master::*&get) () const;
Type (Master::*&set)(Type value);

Property
(
Master &master,
const Type (Master::*get) () const,
Type (Master::*set)(Type value)
):
get(get),
set(set),
master(master)
{ }

operator const Type() const { cout << "inside" << endl; return (master.*get)(); }

Type operator = (Type value)
{
return (master.*set)(value);
}
};

// Test chamber.
class R
{
float x;
const float getx() const { cout << "returning " << 0 << endl; return 0; }
float setx(float value) { cout << "setting " << value << " in place of " << x << endl; return x = value; }
public:
Property<R, float> X;

R(): X(*this, &R::getx, &R::setx) { }
};

}

我还创建了 .cpp 文件:

#include "Property.h"

using namespace First;

int main()
{
R r;

r.X = 10;

float y = r.X;

}

程序执行“分配”步骤,打印“设置 0 到 10”,但在调用“检索”步骤时出现段错误,“R::getx()”中的代码(或根本没有)没有区别。

~/Sources$ ./a.out          

setting 10 in place of 0
inside
zsh: segmentation fault ./a.out

似乎调用 (master.*get()) 本身会导致失败。这段代码有什么问题?

UPD:经测试,对 master 函数的任何其他调用都会导致段错误,只有一次 (master.*set) 调用成功。似乎此调用使对象状态、成员到指针、属性本身或月相无效。

最佳答案

const Type (Master::*&get) () const;
Type (Master::*&set)(Type value);

从上面的定义中删除&。因为&,它们中的每一个都绑定(bind)到构造函数返回后不存在的构造函数参数。

另请注意,(master.*set)(value) 似乎有效,这是因为您不走运。它实际上调用了未定义的行为。但是你很幸运,当 (master.*get)() 失败并给出段错误时,你很快就会知道问题所在。

使用:

const Type (Master::*get) () const;
Type (Master::*set)(Type value);

它现在应该可以正常工作,没有任何问题,因为它会导致复制 初始化列表中的地址,而不是引用参数!

关于c++ - C++模板成员指针属性实现的一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7063185/

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