ikn*_*ges 3 c++ queue reference class constants
演示代码
在文件A中:
class Queuetest{
...
queue<myclass>* mMyQueue = new queue<myclass>;
void addMyclass(myclass& myclassobject){
mMyQueue->push(myclassobject);
}
...
};
Run Code Online (Sandbox Code Playgroud)
在文件B中:
...
Queuetest* mQueuetest = new Queuetest();
mQueuetest->addMyclass(new myclass(...));
...
Run Code Online (Sandbox Code Playgroud)
所以编译告诉我:
对“myclass”类型的引用无法绑定到“myclass *”类型的右值
一些类似的案例给了我原因:
C++ 标准不允许将匿名临时值绑定到引用,尽管某些编译器允许将其作为扩展。(允许绑定到 const 引用。)
但没有办法告诉我如何解决;
我想使用队列来控制我的对象,并使该对象像先进先出(FIFO)一样工作;添加新对象,并弹出最后一个对象,自动释放该对象的内存;
有没有好的方法可以做到这一点?
至少使用 const 限定符
void addMyclass( const myclass& myclassobject){
mMyQueue->push(myclassobject);
}
Run Code Online (Sandbox Code Playgroud)
或者重载该函数,例如
void addMyclass(myclass&& myclassobject){
mMyQueue->push(myclassobject);
}
Run Code Online (Sandbox Code Playgroud)
而不是
mQueuetest->addMyclass(new myclass(...));
Run Code Online (Sandbox Code Playgroud)
使用
mQueuetest->addMyclass(myclass(...));
Run Code Online (Sandbox Code Playgroud)
因为队列被声明为存储该类型的对象myclass而不是指向对象的指针。
queue<myclass>* mMyQueue = ...
^^^^^^^
Run Code Online (Sandbox Code Playgroud)
此外,还不清楚为什么您使用指向std::queue作为数据成员的指针。
queue<myclass>* mMyQueue = new queue<myclass>;
Run Code Online (Sandbox Code Playgroud)
只需声明数据成员即可
queue<myclass> mMyQueue;
Run Code Online (Sandbox Code Playgroud)
这是一个演示程序。
#include <iostream>
#include <queue>
struct myclass
{
};
class Queuetest
{
private:
std::queue<myclass> mMyQueue;
public:
void addMyclass( const myclass &myclassobject )
{
std::cout<< "void addMyclass( const myclass &myclassobject )\n";
mMyQueue.push(myclassobject);
}
void addMyclass( myclass &&myclassobject )
{
std::cout<< "void addMyclass( myclass &&myclassobject )\n";
mMyQueue.push(myclassobject);
}
};
int main()
{
Queuetest test;
test.addMyclass( myclass() );
myclass m;
test.addMyclass( m );
}
Run Code Online (Sandbox Code Playgroud)
它的输出是
oid addMyclass( myclass &&myclassobject )
void addMyclass( const myclass &myclassobject )
Run Code Online (Sandbox Code Playgroud)