有这么一段代码
class A:
abc: B
...
class B:
...
重点是我想创建一个工具提示,指示该字段将具有B类。但 VS Code 告诉我B没有定义。并且这样的代码无法运行。在 C++ 中,要解决这个问题,您可以简单地class A编写类似class B.但在 Python 中却不是这样工作的。
有这么一段代码
class A:
abc: B
...
class B:
...
重点是我想创建一个工具提示,指示该字段将具有B类。但 VS Code 告诉我B没有定义。并且这样的代码无法运行。在 C++ 中,要解决这个问题,您可以简单地class A编写类似class B.但在 Python 中却不是这样工作的。
大家好。请告诉我如何解决这个问题,甚至可以在 C++ 中完成吗?一点介绍。
我在 Qt 工作。它有一个QWidget类,从中继承了各种QLineEdit、QCheckBox、QTextEdit等。(任何图形元素)。还有一个QTableWidget,你可以在它的单元格中使用该方法推入不同的小部件(相同的QLineEdit、QCheckBox、QTextEdit等)void setCellWidget(int row, int column, QWidget *widget);,并且您可以使用该方法获取小部件QWidget *cellWidget(int row, int column) const;
所以,我需要以某种方式向QWidget添加几个虚拟方法,以便它们在相同的QLineEdit、QCheckBox、QTextEdit和其他继承自QWidget的类中可用。也许在QWidget及其后代之间,您可以创建某种层来推送必要的方法,但我不知道如何。这个想法是我应该能够将不同类型的扩展小部件(QLineEdit,QCheckBox ...)放入QTableWidget中,然后以我可以调用我添加的方法的方式将它们取回。但我不能这样做,因为它QTableWidget::cellWidget(row, column);返回一个指向QWidget当然没有我的方法。
或者,您可以从每个必要的图形元素( QLineEdit、QCheckBox ...)继承并在每个元素中编写我需要的方法。
class ExtLineEdit : public QLineEdit
{
public:
void method1();
void method2();
...
}
class ExtCheckBox : public QCheckBox
{
public:
void method1();
void method2();
...
}
...
tableWidget.setCellWidget(0, 0, new ExtLineEdit);
tableWidget.setCellWidget(0, 1, new ExtCheckBox);
但这里的问题是,当我从QTableWidget以指向QWidget的指针格式获取这些小部件时,我必须知道将其转换为什么(到 ExtLineEdit、ExtCheckBox 或其他东西)。这个我不知道。如果有一些接口可以将接收到的QWidget指针转换为它会很方便。然后一切都是多态性的遗赠。
也许我很笨,但我就是无法让它发挥作用。请帮忙。
帮助我理解常规 lambda 和闭包之间的区别(我读到 lambda 并不总是闭包)。
我对几个问题感兴趣:
...
//1. Это замыкание?
[&](int a) { ... };
//2. если да, можно ли сказать что замыкание это когда мы захватывает все внешние объекты или это
// тоже можно считать замыканием
[&var1](int a) { ... };
//3. И тоже самое с захватом значения. Это замыкание?
[=](int a) { ... };
//4. А это?
[var1](int a) { ... };
//4. А если добавить mutable?
[=](int a) mutable { ... };
[var1](int a) mutable { ... };
[](int a) { ... };
一般认为什么是闭包?有人写道,这是我们调用 lambda 的时候。
我有一堂课:
template<class T>
class IdRange
{
T var1_;
...
T var6_;
T start_;
T step_;
public:
IdRange(T start = 0, T step = 1) { ... }
IdRange(IdRange&& other)
: var1_ (std::move(other.var1_)),
...
var6_ (std::move(other.var6_)),
start_(std::move(other.start_)),
step_ (std::move(other.step_))
{
Как сделать здесь?
}
}
(通过“覆盖”我的意思是分配一个默认值。这么短。)
情况是这样的。有不同的字段,我将它们指定为T var1_; ... T var6_;. 一切都很清楚,我将它们从other转移到this并在other中覆盖它们,但也有start_和step_。首先,他们也应该像其他人一样被转移。但那该怎么办呢。start_和step_仅在创建对象时设置,之后无法更改。在这种情况下该怎么办:
和一点澄清。
IdRange(IdRange&& other)
: var1_ (std::move(other.var1_)),
...
var6_ (std::move(other.var6_)),
start_(std::move(other.start_)),
step_ (std::move(other.step_))
}
值得写std::move吗?我不去哪个站点,这里没有人使用它们,没有它们,就会调用复制构造函数,因此调试器会显示是否有任何内容。
有这个代码:
template<class __T>
class IdContainer
{
std::vector<__T> unorderedIds_;
public:
__T getNext() {
auto _it = unorderedIds_.begin();
if (_it != unorderedIds_.end()) {
__T _id = *_it;
unorderedIds_.erase(_it);
return _id;
}
throw std::runtime_error("---");
};
}
也就是说,如果向量是空的,我会抛出一个异常,如果那里有东西,我会返回第一个元素。这样做可能会更好:
bool getNext(__T& id) {
auto _it = unorderedIds_.begin();
if (_it != unorderedIds_.end()) {
id = *_it;
unorderedIds_.erase(_it);
return true;
}
return false;
};
我还看到一个返回指针的选项:
__T* getNext() {
return _id;
or
return nullptr;
}
但是在堆上分配一些 int 有点过头了。
我可能还缺少其他选项。请告诉我编写此函数的最佳方法。她的想法是,她应该给我们第一个id,否则明确id结束。