小编pro*_*cer的帖子

常量类成员,赋值运算符和QList

请确认我是否正确并告诉我是否有更好的解决方案:

我理解具有常量成员的对象int const width;不能由编译器隐式创建的合成赋值运算符处理.但是QList(我想std :: list)也需要一个工作赋值运算符.因此,当我想使用具有常量成员和QList的对象时,我有三种可能性:

  1. 不要使用常数成员.(不是解决方案)
  2. 实现我自己的赋值运算符.
  3. 使用一些不需要赋值运算符的其他容器

那是对的吗?还有其他优雅的解决方案?

我也想知道我是否可以:

  • (4)强制编译器创建一个处理常量成员的赋值运算符!(我不明白为什么这是一个很大的问题.为什么操作员不够智能,不能在内部使用初始化列表?或者我错过了什么?)
  • (5)告诉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类成员所有答案结合在一起回答了我的问题.

c++ qt assignment-operator qlist class-constants

5
推荐指数
2
解决办法
5345
查看次数

什么是函数的常见且合理的参数顺序?

假设它们都是强制性的:

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)

我认为这通常是个人选择的问题,在整个项目中应该保持一致。但我想知道是否有更深层次的逻辑来决定每个案例的顺序。

language-agnostic coding-style function parameter-passing

5
推荐指数
1
解决办法
115
查看次数

堆栈对象不会被Qt识别,但堆对象会识别

我很难理解在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的背景,我看到了颜色,所以我知道它仍然"活着".

c++ oop qt

3
推荐指数
1
解决办法
176
查看次数

如果引用是类成员,如何初始化对象的引用?

假设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.如何为引用创建持久对象?我想使用引用,因为该成员应该是常量.

c++ persistence pointers reference member

3
推荐指数
1
解决办法
2590
查看次数

可选元素是否会破坏RAII,如果是,那么什么是更好的方法?

我有一个二维的细胞矩阵.通常只有不可见的算法才能使用这些单元格.但有时我想要显示每个单元格,所以我添加了一个指向图形对象的指针

class Cell
{
   ...
   QAbstractGraphicsItem* representation_;
   ...
}
Run Code Online (Sandbox Code Playgroud)

Cell的构造函数将representation_设置为0.有时,另一个Visualization类在矩阵上迭代,并向Cells添加元素,以按颜色可视化每个单元格的内容.

我认为这打破了RAII范式.你有更好的方法吗?

我可以创建另一个二维矩阵,并从那里链接到原始矩阵,以便指针在可视化方面,但我需要两个矩阵.

c++ pointers raii

2
推荐指数
1
解决办法
285
查看次数