gpt4 book ai didi

构造函数上的 C++ 方法链接

转载 作者:行者123 更新时间:2023-11-27 23:13:36 25 4
gpt4 key购买 nike

我正在尝试允许在构造函数上进行方法链接,我在这个 C++ method chaining including class constructor 上遇到了同样的问题。我已经尝试了建议的答案,但仍然遇到相同的错误。我的代码如下:

class Signal {

public:
Signal() { }

Signal& Emphasize() {

return *this;
}

};
enum ReadType { NATIVE = 0, DOUBLE, };

class Wav : public Signal {

public:

Wav(string fileName, ReadType type) {

}

};

我曾尝试通过以下方式调用电话:

Wav* wave = new Wav("asf", DOUBLE).Emphasize();

和:

Wav wave = Wav("asf", DOUBLE).Emphasize();

我不知道实际过程是否可行,因为“强调”它不是构造函数,但希望我能被允许访问它。我在这里做错了什么导致它不起作用?

希望有人能帮忙:)

更新:

我将“Emphasize()”作为类成员放在“Wav”中,它起作用了,正如我想要的那样。但是有谁知道我可以在“Signal”中访问这个成员而不必将类成员放在“Wav”中的方法吗?

更新:

class Signal {

public:
Signal() { }

Signal* Emphasize() {
return this;
}
};
enum ReadType {

NATIVE = 0, DOUBLE,
};

class Wav : public Signal {

public:
Wav(string fileName, ReadType type) {

}
};

int main(int argc, char *argv[]) {

Wav* wave = new Wav("asf", DOUBLE)->Emphasize();
}

最佳答案

new 表达式返回一个指针,因此您只需要做:

Wav* wave = new Wav("asf", DOUBLE)->Emphasize();
// ^^

此外,您的方法 Emphasize 返回对 Signal 对象的引用:

Signal& Emphasize() {
// ^ Reference
return *this;
}

但是您正在尝试将此引用分配给指针 Wav*

这里有两个选择:

// ...
Signal* Emphasize() {
return this;
}

// ...
Wav* wave = new Wav("asf", DOUBLE)->Emphasize();

或者你保留你的初始 Emphasize 方法:

// ...
Signal& Emphasize() {
return *this;
}

// ...
Wav wave = new Wav("asf", DOUBLE)->Emphasize();

编辑:好的,真正的错误是您试图将 Signal 对象转换为 Wav 对象。

没有从 SignalWav 对象的转换。

Wav 是信号,但信号不是 Wav。

你可以这样做:

在您的 Signal 类中:

virtual Signal& Emphasize()=0;

在你的 Wav 类中:

Wav& Emphasize()
{
return *this;
}

Signal w = new Wav( "asf", DOUBLE )->Emphasize();

关于构造函数上的 C++ 方法链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18302715/

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