请确认我是否正确并告诉我是否有更好的解决方案:
我理解具有常量成员的对象int const width;不能由编译器隐式创建的合成赋值运算符处理.但是QList(我想std :: list)也需要一个工作赋值运算符.因此,当我想使用具有常量成员和QList的对象时,我有三种可能性:
那是对的吗?还有其他优雅的解决方案?
我也想知道我是否可以:
编辑:我自己从不分配这个类的对象.它们仅由复制构造函数或重载的构造函数创建.因此,只有容器才需要赋值操作符而不是我自己.
EDIT2:这是我创建的赋值运算符.我不确定它是否正确.Cell有两个参数构造函数.这些参数使用初始化列表设置两个常量成员.但该对象还包含其他变量(非常量)成员.
Cell& Cell::operator=(Cell const& other)
{
if (this != &other) {
Cell* newCell = new Cell(other.column(), other.row());
return *newCell;
}
return *this;
}
Run Code Online (Sandbox Code Playgroud)
EDIT3:我发现这个帖子几乎有同样的问题:C++:STL麻烦与const类成员所有答案结合在一起回答了我的问题.
假设它们都是强制性的:
function search (haystack, needle)
function search (needle, haystack)
function placeObject (object, column, row)
function placeObject (column, row, object)
function newObject (parent, width, height, isVisible)
function newObject (isVisible, width, height, parent)
function newObject (width, height, isVisible, parent)
Run Code Online (Sandbox Code Playgroud)
我认为这通常是个人选择的问题,在整个项目中应该保持一致。但我想知道是否有更深层次的逻辑来决定每个案例的顺序。
我很难理解在QT类实例化过程中遇到的问题,但我觉得它可能是一般的oop事情.问题是它只在我使用指向对象的指针但仅仅与对象变量本身一起工作后才起作用.
在main()中,我创建了一个小部件的实例:
Board board;
board.show();
Run Code Online (Sandbox Code Playgroud)
Board.h:
class Board : public QWidget
{
Q_OBJECT
public:
Board(QWidget* parent = 0);
virtual ~Board();
};
Run Code Online (Sandbox Code Playgroud)
Board.cpp
Board::Board(QWidget* parent) :
QWidget(parent)
{
QGraphicsScene* boardScene = new QGraphicsScene(this);
boardScene->setSceneRect(this->rect());
QGraphicsItem* item2 = new QGraphicsPixmapItem(QPixmap("test.jpg"));
item2->setPos(100,100);
boardScene->addItem(item2);
QGraphicsView boardView (boardScene, this);
Run Code Online (Sandbox Code Playgroud)
现在问题出在最后一行.测试图片(第2项)仅在我更改最后一行后显示,因此它是一个指针:
QGraphicsView* boardView = new QGraphicsView (boardScene, this);
Run Code Online (Sandbox Code Playgroud)
为什么对象变量不起作用?这是由于某些内部QT问题还是我错过了什么?我还画了boardScene的背景,我看到了颜色,所以我知道它仍然"活着".
假设Class包含一个名为matrix_的引用:
Class.h
class Class
{
Matrix& matrix_;
}
Run Code Online (Sandbox Code Playgroud)
Class.cpp
Class::Class() : matrix_(Matrix())
{
}
Run Code Online (Sandbox Code Playgroud)
我得到错误:从'Matrix'类型的临时类型初始化'Matrix&'类型的非const引用.
我看到问题是临时对象将消失,引用将指向NULL.如何为引用创建持久对象?我想使用引用,因为该成员应该是常量.
我有一个二维的细胞矩阵.通常只有不可见的算法才能使用这些单元格.但有时我想要显示每个单元格,所以我添加了一个指向图形对象的指针
class Cell
{
...
QAbstractGraphicsItem* representation_;
...
}
Run Code Online (Sandbox Code Playgroud)
Cell的构造函数将representation_设置为0.有时,另一个Visualization类在矩阵上迭代,并向Cells添加元素,以按颜色可视化每个单元格的内容.
我认为这打破了RAII范式.你有更好的方法吗?
我可以创建另一个二维矩阵,并从那里链接到原始矩阵,以便指针在可视化方面,但我需要两个矩阵.