见标题.
我有:
class Foo {
private:
Foo();
public:
static Foo* create();
}
Run Code Online (Sandbox Code Playgroud)
我需要做什么才能让Foo无法复制?
谢谢!
为了防止复制类,您可以非常轻松地声明私有复制构造函数/赋值运算符.但你也可以继承boost::noncopyable
.
在这种情况下使用boost有什么优点/缺点?
使用C++ 11中显式删除的成员函数,是否仍然值得从不可复制的基类继承?
我在谈论私有继承基类的技巧,该基类具有私有或删除的复制构造函数和复制赋值(例如boost::noncopyable
).
这个问题提出的优势是否仍适用于C++ 11?
我不明白为什么有些人声称在C++ 11中使类不可复制更容易.
在C++ 03中:
private:
MyClass(const MyClass&) {}
MyClass& operator=(const MyClass&) {}
Run Code Online (Sandbox Code Playgroud)
在C++ 11中:
MyClass(const MyClass&) = delete;
MyClass& operator=(const MyClass&) = delete;
Run Code Online (Sandbox Code Playgroud)
编辑:
正如许多人所指出的那样,为私有拷贝构造函数和拷贝赋值运算符提供空体(即{})是错误的,因为这将允许类本身调用那些运算符而没有任何错误.我首先开始没有添加{},但遇到了一些链接器问题,这些问题让我添加{}有些愚蠢的原因(我不记得这些情况).我知道更清楚.:-)
将任何不可复制的成员添加到类将阻止自动生成复制构造和赋值运算符.为什么boost需要继承才能使用noncopyable?
我想我并不孤单
class MyUtility : public MyBase
{
noncopyable guard;
...
};
Run Code Online (Sandbox Code Playgroud)
而不是
class MyUtility : public MyBase , private noncopyable
{
...
};
Run Code Online (Sandbox Code Playgroud)
戴夫亚伯拉罕是一个聪明人,所以他可能考虑过这种可能性.我错过了什么?遗产成就了什么?
我一直在谷歌和stackoverflow搜索2小时.必须有一些我只是俯瞰.有没有一种简单的方法可以在消息框中选择文本?就在我现在调用MessageBox.Show()时,我无法复制显示的文本.为什么不?我如何设置文本可复制?
我的代码:
//catch all exceptions
catch (Exception ex)
{
MessageBox.Show(ex.Message);
//throw;
}
Run Code Online (Sandbox Code Playgroud)
我希望能够选择出现的错误消息,以便用户将其发送给我,我可以解决他们的问题.任何帮助是极大的赞赏.
编辑:不能使用crtl-c方法.我的用户无法掌握这个概念.需要用鼠标突出显示并右键单击以选择选项.谢谢!
编辑:作为参考我最终做的是使用答案的混合.我创建了一个带有单个按钮的弹出窗口,并在按钮操作后复制到剪贴板.它不完美,但有正确的标签,它现在运作良好.谢谢大家的建议!
//catch all exceptions
catch (Exception ex)
{
//MessageBox.Show(ex.Message);
MessageBoxButtons buttons = MessageBoxButtons.OK;
DialogResult result;
// Displays the MessageBox.
result = MessageBox.Show(ex.Message + "\n\nClick OK button to copy to clipboard", "Error", buttons);
if (result == System.Windows.Forms.DialogResult.OK)
{
Clipboard.SetText(ex.Message);
//throw;
}
}
Run Code Online (Sandbox Code Playgroud) 在Qt中有一个宏允许为类声明私有拷贝构造函数和赋值运算符:http://qt-project.org/doc/qt-5.0/qtcore/qobject.html#Q_DISABLE_COPY
据说这个宏应该用于所有QObject(尤其是QWidget)派生类.
我理解这是如何工作的以及为什么它有用.
我不明白:有什么理由在我的QObject派生类中重复Q_DISABLE_COPY而QObject已经包含Q_DISABLE_COPY并且通过这有效地防止了我的派生类被复制了吗?
如果我们有一个具有不可复制值类型的容器,这样的容器类仍然定义了复制构造函数,只是它可能不会被调用.
using T = std::vector<std::unique_ptr<int>>;
std::cout << std::is_copy_constructible_v<T>; // prints out "1" (libstdc++)
Run Code Online (Sandbox Code Playgroud)
这可能会导致"隐藏"问题,例如此处讨论的问题:Visual Studio 2017是否需要显式移动构造函数声明?.
我的问题是标准库实现是否可以将此类复制构造函数定义为有条件删除,即在不可复制的值类型的情况下删除.这对我来说是完全合理的(至少在有C++概念之前).这种实施是否符合标准?
看看下面的代码:
#include <utility>
#include <map>
// non-copyable but movable
struct non_copyable {
non_copyable() = default;
non_copyable(non_copyable&&) = default;
non_copyable& operator=(non_copyable&&) = default;
// you shall not copy
non_copyable(const non_copyable&) = delete;
non_copyable& operator=(const non_copyable&) = delete;
};
int main() {
std::map<int, non_copyable> map;
//map.insert({ 1, non_copyable() }); < FAILS
map.insert(std::make_pair(1, non_copyable()));
// ^ same and works
}
Run Code Online (Sandbox Code Playgroud)
在取消注释g ++ 4.7上的标记行时,编译此代码段失败.产生的错误表明non_copyable
无法复制,但我预计它会被移动.
为什么插入std::pair
使用统一初始化的构造失败但没有使用构造std::make_pair
?两者都不应该产生可以成功移入地图的右值吗?
假设我有一个不可复制的类,其中包含多个类似的构造函数
class Foo: boost::noncopyable
{
public:
Foo(std::string s) {...}; // construct one way
Foo(int i) {...}; // construct another way
}
Run Code Online (Sandbox Code Playgroud)
现在,我想构造一个对象,并选择在运行时使用哪个构造函数:
我可以用这样的指针做到: -
boost::shared_ptr<Foo> f;
if (condition)
f.reset(new Foo(myString));
else
f.reset(new Foo(myInteger));
// common code follows
f->doSomethingComplicated(...);
Run Code Online (Sandbox Code Playgroud)
但这感觉很麻烦而且很慢.是否有一种简单的方法可以选择对象的构造函数而无需动态分配?
更多细节:Foo
上面的类只是为了说明问题.涉及的实际类是Windows Gdiplus::Bitmap
- http://msdn.microsoft.com/en-gb/library/windows/desktop/ms534420(v=vs.85). ASPX
根据我最喜欢的作者斯科特迈耶斯先生的说法,私人继承和组合意味着同样的事情,即Has-A关系.因此,可以通过私有继承获得从组合中获得的所有东西(包含A类,其中A类具有B类成员),反之亦然.
所以下面的代码应该是Has-A关系,但从我的观点来看,它不是!
class A : private boost::noncopyable {.. this is irrelevant };
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我,我失踪了吗?或者如何通过合成实现此代码?
noncopyable ×10
c++ ×9
boost ×3
c++11 ×2
c# ×1
containers ×1
inheritance ×1
messagebox ×1
movable ×1
qobject ×1
qt ×1
qt5 ×1
text ×1