我有两个关于以下代码的问题.
class cls{
int vi;
public:
cls(int v=37) { vi=v; }
friend int& f(cls);
};
int& f(cls c) { return c.vi; }
int main(){
const cls d(15);
f(d)=8;
cout<<f(d);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
嘿,我有一个包含值的列表,我想用const&打印出来.我可以通过引用它来做到这一点但是当我把const放入时我得到一个错误.我不确定为什么会这样,因为代码不会编辑列表.这是我的代码.
// Prints out the list declared
template<typename DATA_TYPE>
void print(const list<DATA_TYPE> &myList){
for(list<DATA_TYPE>::iterator pos = myList.begin(); pos != myList.end(); pos++){
DATA_TYPE currentWord = *pos;
cout << currentWord << " ";
}
}
Run Code Online (Sandbox Code Playgroud)
如果你也可以通过错误背后的逻辑,那就太酷了,谢谢.
我创建了简单的代码片段,以显示我注意到的奇怪行为.而已:
#include <QCoreApplication>
#include <QLineEdit>
class MyObject : public QWidget
{
public:
explicit MyObject(QWidget *parent = 0) : QWidget(parent) {
editor = new QLineEdit(this);
}
void setValue(const QString &s) const {
editor->setText(s);
editor->setReadOnly(true);
editor->setMaxLength(s.length());
}
private:
QLineEdit *editor;
};
int main(int argc, char **argv)
{
QCoreApplication app(argc, argv);
return app.exec();
}
Run Code Online (Sandbox Code Playgroud)
MyObject::setValue函数有const说明符,但这段代码编译得很好.需要注意的是setText,setReadOnly和setMaxLength功能都没有const:
void setText(const QString &);
void setReadOnly(bool);
void setMaxLength(int);
Run Code Online (Sandbox Code Playgroud)
我只是想知道导致这种行为的原因是什么?我使用Qt 4.7.4和MingGW 4.6.2.
我有2个成员函数的问题,其中一个是const返回一个const:
const BoardNode & Board::getBoardNode(unsigned int rowIdx, unsigned int colIdx) const
{
return _mData[rowIdx*_mNumColumns + colIdx];
}
BoardNode & Board::getBoardNode(unsigned int rowIdx, unsigned int colIdx)
{
return _mData[rowIdx*_mNumColumns + colIdx];
}
Run Code Online (Sandbox Code Playgroud)
过了一会儿我用的代码:
// where this is a Board holding Nodes in std::vector
BoardNode nodeToAddAsNeighbor = this->getBoardNode(x1+ x, y1+ y);
Run Code Online (Sandbox Code Playgroud)
无论的值y1,y,x,x1是的,我总是回以坐标中的节点(0,0).
然而,节点的其他参数是不同的,只有如上所述的坐标.
知道为什么吗?
编辑 我的副本构造函数:
BoardNode::BoardNode(const BoardNode & other) :
_mNodeType(other._mNodeType),
_coordinates( other._coordinates ),
_neighboursVector( other._neighboursVector) {}
Run Code Online (Sandbox Code Playgroud) 假设我有一个基类foo
class foo {
virtual int get() const = 0;
}
Run Code Online (Sandbox Code Playgroud)
也许有20个子类foo_1,foo_2 ...继承自foo并且形式为:
class foo_1 : public foo {
int get() const { return 1; }
}
...
class foo_20 : public foo {
int get() const { return 20; }
}
Run Code Online (Sandbox Code Playgroud)
突然生活并不那么容易!我有一个类foo_21,必须这样做:
class foo_21 : public foo {
int get() { member_ = false; return 0; }
bool member_;
}
Run Code Online (Sandbox Code Playgroud)
问题是get在基类中声明为const,我必须在子类foo_21中更改一些东西.我怎么能找到一种解决方法呢?
我有一个功能
void h(A const a){...};
Run Code Online (Sandbox Code Playgroud)
如果我这样做,行为是否有可能改变:
void h(A const &a){..same body as above..};
Run Code Online (Sandbox Code Playgroud)
您可以根据需要自由定义类型A. 当然.
程序#1
// file.h
class File
{
public:
static const int var = 9;
};
Run Code Online (Sandbox Code Playgroud)
-
// main.cpp
#include <iostream>
#include "file.h"
using namespace std;
int main() {
File f;
cout << f.var;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
程序#2
// file.h
int GlobalVar ;
class File
{
public:
static const int var = 9;
};
Run Code Online (Sandbox Code Playgroud)
-
// main.cpp
extern int GlobalVar;
#include <iostream>
#include "file.h"
using namespace std;
int main() {
cout << GlobalVar;
return 0 ;
}
Run Code Online (Sandbox Code Playgroud)
程序#1运行正常,但程序#2给出链接器错误:
error LNK2005: "int GlobalVar" …Run Code Online (Sandbox Code Playgroud) 我正在使用Opencv/c ++.我使用该函数获取视频中的帧数
int noOfFrames = cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_COUNT );
我还宣布了一个数组int Entropy[noOfFrames];.但由于变量noOfFrames是非常量的,因此会出错.
我甚至用过const_cast这个,但它仍然给出了错误.我希望数组的长度等于视频的帧数.
我该怎么做 ???
我确定我做错了什么,但对于我的生活,我无法弄清楚是什么!请考虑以下代码:
cerr<<el.getText()<<endl;
cerr<<el.getText().c_str()<<endl;
cerr<<"---"<<endl;
const char *value = el.getText().c_str();
cerr<<"\""<<value<<"\""<<endl;
field.cdata = el.getText().c_str();
cerr<<"\""<<field.cdata<<"\""<<endl;
Run Code Online (Sandbox Code Playgroud)
el是一个XML元素并getText返回一个std :: string.正如预期的那样,el.getText()和el.getText().c_str()打印相同的值.但是,当它分配结果时,value设置为""- 即空字符串c_str().此代码已写入设置field.cdata=value,因此清除它.将其更改为所谓的相同表达式value后,它可以正常工作,最后一行打印出预期值.
因为el在堆栈中,我认为我可能已经破坏了它 - 但即使在value设置之后,基础值el仍然是正确的.
我的下一个想法是,有一些奇怪的编译器特定问题,将事物分配给const指针,所以我写了以下内容:
std::string thing = "test";
std::cout << thing << std::endl;
std::cout << thing.c_str() << std::endl;
const char* value = thing.c_str();
std::cout << value << std::endl;
Run Code Online (Sandbox Code Playgroud)
正如所料,我进行了三次"测试".
所以现在我不知道发生了什么.很明显,我的程序中有一些奇怪的事情在样本中没有发生,但我不知道它是什么,我不知道如何继续寻找.有人可以启发我,或者至少指出我正确的方向吗?
我正在搜索代码中的错误,我有一个问题:
class a
{
public:
void foo(int a) {}
}
std::set<a*> set;
std::set<a*>::iterator it = set.begin();
it->foo(55); //gives me error:
// error: request for member ‘foo’ in ‘* it.std::_Rb_tree_const_iterator<_Tp>::operator-><a*>()’, which is of pointer type ‘a* const’ (maybe you meant to use ‘->’ ?)
Run Code Online (Sandbox Code Playgroud)
为什么它不允许我使用非const函数呢?如果不使用强制转换,我可以做一组非常量指针?